php – Yii 2:与同一个表的多重关系

前端之家收集整理的这篇文章主要介绍了php – Yii 2:与同一个表的多重关系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到了Yii 2关系表的问题.我的工作有很多关系,但只有在这种情况下才会给我一个错误

sqlSTATE[42S22]: Column not found: 1054 Unknown column ‘father.name’ in ‘where clause’

我认为问题是与同一个表“代理”的双重关系.查看模型中的代码段:

  1. public function getAgent()
  2. {
  3. return $this->hasOne(Agent::className(),['id' => 'id_agent']);
  4. }
  5. public function getFather()
  6. {
  7. return $this->hasOne(Agent::className(),['id' => 'id_father']);
  8. }

在我的GridView中,我看到了正确的值,但是当我尝试使用ORDER或“andWhere”进行过滤时,Yii2会返回错误.

您可以在下面找到searchModel的代码

  1. $dataProvider->sort->attributes['agentName'] = [
  2. 'asc' => ['agent.name' => SORT_ASC],'desc' => ['agent.name' => SORT_DESC],'default' => SORT_ASC
  3. ];
  4.  
  5. $dataProvider->sort->attributes['fatherName'] = [
  6. //'asc' => ['father.name' => SORT_ASC],//'desc' => ['father.name' => SORT_DESC],'default' => SORT_ASC
  7. ];
  8. //.......
  9. $query->andFilterWhere(['like','agent.name',$this->agentName]);
  10. $query->andFilterWhere(['like','father.name',$this->fatherName]);

agentName属性工作正常.
有什么建议吗?
谢谢!

——-更新:更多代码———
searchModel:

  1. public function search($params)
  2. {
  3. $agent_aux = new Agent();
  4. $agent_id= $agent_aux->getAgentIdFromUser();
  5.  
  6. if (Yii::$app->user->can('admin')){
  7. $query = Contract::find();
  8. }
  9. else{
  10.  
  11. $query = Contract::find()->where(['contract.agent_id' => $agent_id]);
  12. }
  13.  
  14. $query->joinWith(['agent','seminar']);
  15.  
  16. $dataProvider = new ActiveDataProvider([
  17. 'query' => $query,]);
  18. $this->load($params);
  19. $dataProvider->sort->attributes['seminar_location'] = [
  20. 'asc' => ['seminar.location' => SORT_ASC],'desc' => ['seminar.location' => SORT_DESC],];
  21. $dataProvider->sort->attributes['agentName'] = [
  22. 'asc' => ['agent.name' => SORT_ASC],'default' => SORT_ASC
  23. ];
  24.  
  25. $dataProvider->sort->attributes['fatherName'] = [
  26. //'asc' => ['father.name' => SORT_ASC],'default' => SORT_ASC
  27. ];
  28. if (!$this->validate()) {
  29. return $dataProvider;
  30. }
  31. $query->andFilterWhere([
  32. 'id' => $this->id,'data' => $this->data,'id_agent' => $this->id_agent,'id_father' => $this->id_father,'id_seminar' => $this->id_seminar,]);
  33. $query->andFilterWhere(['like',$this->agentName]);
  34. $query->andFilterWhere(['like',$this->fatherName]);
  35. return $dataProvider;
  36. }
您需要在模型中进行以下更改. from子句实际上是在创建一个别名.代理人和父亲关系将在单独的连接条款中被选中.在过滤条件中使用“代理”和“父”别名与列名称.
  1. public function getAgent()
  2. {
  3. return $this->hasOne(Agent::className(),['id' => 'id_agent'])->from(['agent' => Agent::tableName()]);
  4. }
  5.  
  6. public function getFather()
  7. {
  8. return $this->hasOne(Agent::className(),['id' => 'id_father'])->from(['father' => Agent::tableName()])
  9. }

要改变的另一件事是

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

猜你在找的PHP相关文章