【问题标题】:Yii2 - dataProvider related models are not setYii2 - 未设置 dataProvider 相关模型
【发布时间】:2020-01-28 16:20:28
【问题描述】:

我有以下 SearchModel ComputerSearch,我在其中对查询进行连接(我必须过滤相关表的字段):

class ComputerSearch extends Computer {

  public function search($params) {
      $query = Computer::find();
      $query->innerJoinWith('mainboard');

      $dataProvider = new ActiveDataProvider([
          'query' => $query,
      ]);

      $this->load($params);

      if (!$this->validate()) {
          return $dataProvider;
      }

      return $dataProvider;
  }
}

当我使用var_dump($query->createCommand()->rawSql); 打印查询并执行输出时,我将获得计算机和主板的所有数据(它是 1:1 关系!)。

但是:$dataProvider->models[0]->mainboard 始终为空,即使数据库中有数据。 如果我取出$query->innerJoinWith('mainboard'); 的行,$dataProvider->models[0]->mainboard 会正确显示相关模型(实际上在 db 中有一个)。谁能告诉我,为什么我加入mainboard时,$dataProvider中的相关模型设置不正确?

【问题讨论】:

  • 在计算机类中,您应该有一个名为 getMainboard() 的关系,它将定义关系。 mainboard 在这种情况下不是表名,而是关系名。

标签: yii2 dataprovider


【解决方案1】:

这可能是 Yii 框架的错误 :) 我遇到了同样的问题:

  • 尝试在 Join 方法中使用 FULL OUTER JOIN 而不是 INNER JOIN
  • $query->join(Computer::tableName(), Computer::tableName() . '.id = ' = ' . Mainboard::tableName() . '.id') 或类似的东西

【讨论】:

  • 非常感谢,一切正常。我希望我能找到一个更好的解决方案。 $query = Computer::find() ->join('FULL OUTER JOIN', Mainboard::tableName(), Mainboard::tableName() . '.computer_id = ' . Computer::tableName() . '.id' );
【解决方案2】:
$query = self::find();
$query->innerJoin(Mainboard::tableName(), 'computer.mainboard_id=mainboard.id')
      ->select('computer.*, mainboard.*');

试试这个

【讨论】:

    【解决方案3】:
    `$dataProvider->models[0]->mainboard`  this will give you only result 
    

    第一条记录,有可能是computer的第一条记录
    没有mainboard要么使用loop打印数据要么使用$dataProvider->getModels()你会在每台计算机数据中找到关系数据。

    主板应该和电脑有关系,比如: 在计算机模型中:

    public function getMainboard(){
       return $this->hasMany(Mainboard::className(), ['computer_id', 'id']);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多