Yii 2: множественные отношения с одной и той же таблицей

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

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «имя отца» в «предложении где»

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

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 работают нормально.
Любое предложение?
Спасибо!

——-ОБНОВЛЕНИЕ: больше кода ———
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;
}

6

Решение

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

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']);
14

Другие решения

Альтернативой ответу @FidoXLNC может быть определение псевдонима при выполнении объединения:

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

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

1

По вопросам рекламы [email protected]