【问题标题】:Yii2 - GridView shows "(not set)" If a related Model's column is in list and getting filteredYii2 - 如果相关模型的列在列表中并被过滤,则 GridView 显示“(未设置)”
【发布时间】:2020-01-27 13:53:24
【问题描述】:

我有两个表/模型计算机和主板

Computer - 具有以下列/字段:

  • 身份证
  • 姓名
  • mainboard_Id
  • 序列号
  • ...

Mainboard - 带有以下列/字段:

  • 身份证
  • 姓名
  • 类型
  • 序列号
  • ...

这些模型是一对一的关系。

Computer 模型中我有以下方法:

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

该视图包含以下 GridView:

    echo GridView::widget([
      'dataProvider' => $dataProvider,
      'filterModel' => null,
      'columns' => [
        'id',
        'name',
        'mainboard.type',
        'serial_number',

      ],
    ]);

我的 SearchModel ComputerSearch 如下所示:

class ComputerSearch extends Computer {
  public $mainboardType;

  public function rules() {
      return [
        // ...
          [['mainboardType'], 'safe'],
      ];
  }

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

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

      $this->load($params);

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

      $query->andFilterWhere([Mainboard::tableName() . '.type' => $this->mainboardType]);

      return $dataProvider;
  }
}

我的问题:使用此代码,它显示 mainboard.type 的“(未设置)”,即使我在将构建的查询粘贴到 sql 并手动执行时获取了所有数据。 当我取出ComputerSearch 中的innerJoinWith() 行时,过滤器将不再起作用,因为它当然无法在dbo.Computer 中找到type 列,但随后GridView 已完成,mainboard.type 字段为显示正确。

有人知道我如何过滤dbo.Mainboard.type 并将其显示在Computer 的视图中吗?

【问题讨论】:

  • 问题有点不清楚。我发现你的searchModel 没有this->type。在andFilerWhere() 中将是this->mainboardType。但是您在 gridview 中的过滤器在哪里?
  • @InsaneSkull 最后我想在计算机列表中显示主板类型,同时我希望用户能够过滤主板类型。为了使它可以过滤,我必须在 SearchModel 中执行 innerJoinWith('mainboard') 。但是当我这样做时,它会在计算机列表视图的主板类型列中显示“(未设置)。
  • @InsaneSkull 但到目前为止谢谢你,我刚刚修复了你在示例代码中提到的错误部分。我的问题是另一个问题
  • 它应该显示mainboard.type 而不是not set。检查$dataProvider->models 的结果以查找关系mainboard 已填充并包含相关数据。我猜你的相关数据是空的。
  • @InsaneSkull 你是对的!只要我执行 innerJoinWith('mainboard'),$dataProvider->models[0]->mainboard 为空,当我删除 innerJoinWith('mainboard') 时,就有正确的主板模型。您能告诉我为什么会发生此问题或如何解决此问题吗?

标签: activerecord gridview yii2


【解决方案1】:

我建议将您的 GridView 字段 'mainboard.type' 更改为

echo GridView::widget([
  'dataProvider' => $dataProvider,
  'filterModel' => null,
  'columns' => [
    'id',
    'name',
    [
        'attribute' => 'mainboardType',
        'value' => 'mainboard.type',
    ],
    'serial_number',

  ],
]);

您的其余代码似乎没问题。 其次,如果您的数据库区分大小写,我建议您手动将字段设置为相同的大小写

->andFilterWhere(['like', 'LOWER(mainboard.type)', mb_strtolower($this->mainboardType)])

最后,如果上述方法没有帮助,请尝试更改 innerJoinWith 进行测试

->joinWith('mainboard')

【讨论】:

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