Activerecord Yii2-GridView显示“;(未设定)“;如果是相关型号';s列位于列表中,正在进行筛选

Activerecord Yii2-GridView显示“;(未设定)“;如果是相关型号';s列位于列表中,正在进行筛选,activerecord,gridview,yii2,Activerecord,Gridview,Yii2,我有两张桌子/型号电脑和主板 计算机-具有以下列/字段: 身份证 名字 主板Id 序列号 主板-具有以下列/字段: 身份证 名字 类型 序列号 这些模型是一对一的关系 在计算机模型中,我有以下方法: public function getMainboard() { return $this->hasOne(Mainboard::className(), ['id' => 'mainboard_id']); } 该视图包含以下GridVie

我有两张桌子/型号电脑和主板

计算机
-具有以下列/字段:

  • 身份证
  • 名字
  • 主板Id
  • 序列号
主板
-具有以下列/字段:

  • 身份证
  • 名字
  • 类型
  • 序列号
这些模型是一对一的关系

计算机
模型中,我有以下方法:

    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会显示“(未设置)”。键入
,即使我在将内置查询粘贴到sql并手动执行时获得了所有数据。 当我取出
ComputerSearch
中的
innerJoinWith()
行时,过滤器将不再工作,因为它当然无法在
dbo.Computer
中找到列
type
,但此时GridView已完成,并且mainboard.type字段显示正确


有人知道我如何筛选
dbo.Mainboard.type
并将其显示在
计算机的视图中吗?

我建议将您的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')

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