【发布时间】: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