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',
],
]);
我的SearchModelComputerSearch
如下所示:
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')时,就有正确的主板型号。您能告诉我为什么会出现此问题,或者如何解决此问题吗?