Yii 2:具有相同 table 的多重关系
Yii 2: multiple relation with same table
我遇到了 Yii 2 Relation Table 的问题。我的工作有很多关系,但只有在这种情况下return我一个错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'father.name' in 'where clause'
我认为问题是具有相同 Table "Agent" 的双重关系。见模型中的一段代码:
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 return 出现了错误。
您可以在下面找到 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 属性工作正常。
有什么建议吗?
谢谢!
--------更新:更多代码--------
搜索模型:
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;
}
您需要对模型进行以下更改。 from 子句实际上是在创建一个别名。代理人和父亲关系将在单独的连接子句中选择。在带有列名的过滤条件中使用 "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']);
@FidoXLNC 的答案的替代方法可能是在您进行连接时定义别名:
$query->joinWith([
'seminar',
'agent' => function ($q) { $q->from(Agent::tableName() . ' agent' ); },
'father' => function ($q) { $q->from(Agent::tableName() . ' father'); }
]);
但是据我所知,您必须指定这两种关系,而不仅仅是一个。
我遇到了 Yii 2 Relation Table 的问题。我的工作有很多关系,但只有在这种情况下return我一个错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'father.name' in 'where clause'
我认为问题是具有相同 Table "Agent" 的双重关系。见模型中的一段代码:
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 return 出现了错误。
您可以在下面找到 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 属性工作正常。 有什么建议吗? 谢谢!
--------更新:更多代码-------- 搜索模型:
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;
}
您需要对模型进行以下更改。 from 子句实际上是在创建一个别名。代理人和父亲关系将在单独的连接子句中选择。在带有列名的过滤条件中使用 "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']);
@FidoXLNC 的答案的替代方法可能是在您进行连接时定义别名:
$query->joinWith([
'seminar',
'agent' => function ($q) { $q->from(Agent::tableName() . ' agent' ); },
'father' => function ($q) { $q->from(Agent::tableName() . ' father'); }
]);
但是据我所知,您必须指定这两种关系,而不仅仅是一个。