2015-09-28 3 views
6

У меня проблема с таблицами отношений Yii 2. Моя работа имеет много связей, но только в этом случае вернуть мне ошибку:Yii 2: множественное отношение к одной таблице

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'father.name' in 'where clause'

Я думаю, что проблема двойного отношения с одной и той же таблице «Агент». Смотрите фрагмент кода в модели:

public function getAgent() 
{ 
    return $this->hasOne(Agent::className(), ['id' => 'id_agent']); 
} 
public function getFather() 
{ 
    return $this->hasOne(Agent::className(), ['id' => 'id_father']); 
} 

В моей GridView я вижу правильные значения, но когда я пытаюсь фильтровать с ORDER или с «andWhere», Yii2 возвращает ошибку.

Ниже вы можете найти кусок кода для searchModel:

$dataProvider->sort->attributes['agentName'] = [ 
     'asc' => ['agent.name' => SORT_ASC], 
     'desc' => ['agent.name' => SORT_DESC], 
     'default' => SORT_ASC 
    ]; 

$dataProvider->sort->attributes['fatherName'] = [ 
     //'asc' => ['father.name' => SORT_ASC], 
     //'desc' => ['father.name' => SORT_DESC], 
     'default' => SORT_ASC 
    ]; 
//....... 
$query->andFilterWhere(['like', 'agent.name', $this->agentName]); 
$query->andFilterWhere(['like', 'father.name', $this->fatherName]); 

атрибуты, которые AgentName работает отлично. Любое предложение? Спасибо!

------- UPDATE: больше кода --------- searchModel:

public function search($params) 
{ 
    $agent_aux = new Agent(); 
    $agent_id= $agent_aux->getAgentIdFromUser(); 

    if (Yii::$app->user->can('admin')){ 
     $query = Contract::find(); 
    } 
    else{ 

     $query = Contract::find()->where(['contract.agent_id' => $agent_id]);    
    } 

    $query->joinWith(['agent','seminar']); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 
    $this->load($params); 
    $dataProvider->sort->attributes['seminar_location'] = [ 
     'asc' => ['seminar.location' => SORT_ASC], 
     'desc' => ['seminar.location' => SORT_DESC], 
    ]; 
    $dataProvider->sort->attributes['agentName'] = [ 
     'asc' => ['agent.name' => SORT_ASC], 
     'desc' => ['agent.name' => SORT_DESC], 
     'default' => SORT_ASC 
    ]; 

    $dataProvider->sort->attributes['fatherName'] = [ 
     //'asc' => ['father.name' => SORT_ASC], 
     //'desc' => ['father.name' => SORT_DESC], 
     'default' => SORT_ASC 
    ]; 
    if (!$this->validate()) { 
     return $dataProvider; 
    } 
    $query->andFilterWhere([ 
     'id' => $this->id, 
     'data' => $this->data, 
     'id_agent' => $this->id_agent, 
     'id_father' => $this->id_father, 
     'id_seminar' => $this->id_seminar, 
    ]); 
    $query->andFilterWhere(['like', 'agent.name', $this->agentName]); 
    $query->andFilterWhere(['like', 'father.name', $this->fatherName]); 
    return $dataProvider; 
} 
+0

Возможно, у вас есть имя с исправленной ошибкой. –

+0

@InsaneSkulll, если я использую «агент» в качестве имени столбца (теперь я использую «отец», имя отношения), поиск фильтрует данные с помощью первого отношения (Агент):/ – garsim

+0

У вас есть строка $ query-> с («агент», «отец») или что-то в этом роде? Вы можете показать полный источник запроса? – robsch

ответ

13

Вам необходимо сделать следующие изменения в вашей модели. из предложения фактически создает псевдоним. агент и отношение отца будут выбраны в отдельных предложениях о присоединении. Используйте псевдоним «agent» и «father» в ваших критериях фильтра с именами столбцов.

public function getAgent() 
{ 
    return $this->hasOne(Agent::className(), ['id' => 'id_agent'])->from(['agent' => Agent::tableName()]); 
} 

public function getFather() 
{ 
    return $this->hasOne(Agent::className(), ['id' => 'id_father'])->from(['father' => Agent::tableName()]) 
} 

Другое дело, чтобы изменить это

$query->joinWith(['agent','seminar', 'father']); 
+0

Хорошо! Это работает :) Спасибо! – garsim

1

Альтернативой ответа @FidoXLNC мог бы определить псевдоним, когда вы делаете джойн:

$query->joinWith([ 
    'seminar', 
    'agent' => function ($q) { $q->from(Agent::tableName() . ' agent'); }, 
    'father' => function ($q) { $q->from(Agent::tableName() . ' father'); } 
]); 

Но AFAIK вы должны указать оба отношения, а не только одно.

 Смежные вопросы

  • Нет связанных вопросов^_^