是GridView需要显示来自连接模型的数据的地方。
这可以通过两种方式完成:通过在模型中声明一个公共虚拟字段,以及通过在 和 中操作这些字段的名称和dataProvider值gridView。还有一种方式是不指定虚拟字段,而是简单的在方法中search注册$query->joinWith需要的模型,在过滤器中添加搜索条件 by id,例如:
public function search($params) {
$query = User::find();
$query->joinWith('user');
...
$query->andFilterWhere(['ilike', Settings::tableName() . '.name', $this->settings_id])
...
}
在网格中,可以user.settings_id毫无问题地通过属性进行操作。
第一个选项看起来很拐杖(尽管它在框架指南中有所描述)。如果有多个相关模型,例如三个或四个,则第二个选项将不起作用
有几个问题:
- 有没有办法避免编写虚拟字段,只是组织搜索而不是纯粹使用视图标识符进行操作
user_id?因为这两种方法看起来都像绝对的拐杖。如果过滤器消失并且您必须围起这样一个奇怪的花园,为什么有必要在网格视图中访问相关模型和字段? 您如何在一个甚至两个或三个表中搜索和排序相关字段而不求助于虚拟字段?例如
firm→subdepartment→user→settings→name。那些。进入gridView它就像:[ 'attribute' => 'Наименование настройки', 'value' => 'subdepartment.user.setttings.name', ]
你是说拐杖?!创建一个继承自 Modal 类的 SerchModel,为过滤器添加必要的字段,例如 $settingName,为此字段编写 rulse,加入表。在 GridView 元素 (
'attribute' => 'settingName') 中输入过滤器属性的值,在 'value' 中或通过'content' => function ($model) { return $model->user->setttings->name }链接,您可以将其格式化为与输出中相同的方式:这就是过滤器在框架中的工作方式,框架有足够的其他骨骼,所以你可以闭上眼睛看过滤器这样的小事。