【发布时间】:2016-08-09 05:19:29
【问题描述】:
【问题讨论】:
-
你需要关系表数据还是不同的表数据?
-
是的,关系。 “role”表中的id等于“user”表中的role_id
-
你检查我的答案了吗?
标签: php list yii2 multi-select dropdown
【问题讨论】:
标签: php list yii2 multi-select dropdown
对于详细视图,检查模型中的关系并使用您这样做的关系:-
'attributes' => [
'title',
'relational_data',
[
'label' => 'Field Name',
'value' => $data->relation_table->field_name,
],
],
对于网格视图:-
[
'attribute' => 'role_id',
'value' => function ($data) {
return $data->relation_table->field_name;
},
],
你的表关系应该是这样的:-
public function getRelation_table()
{
return $this->hasOne(Table::className(), ['relation_id' => 'id']);
}
【讨论】:
使用匿名函数来改变属性的值。而不是简单
role_id,
在 GridView 列的列表上使用数组
[
'attribute' => 'role_id',
'value' => function ($model, $key, $index, $column) {
return $model->role_id;
},
],
现在这将为您提供完全相同的结果,但您可以自定义它。例如:
[
'attribute' => 'role_id',
'value' => function ($model, $key, $index, $column) {
switch ($model->role_id) {
case 1:
return 'User';
case 2:
return 'Moderator';
case 3:
return 'Admin';
}
},
],
也许您已经创建了包含在您的 User 类中命名的所有角色的方法:
public static function listRoles()
{
return [
1 => 'User',
2 => 'Moderator',
3 => 'Admin',
];
}
所以您可以在 GridView 中使用它,例如:
[
'attribute' => 'role_id',
'value' => function ($model, $key, $index, $column) {
return User::listRoles()[$model->role_id];
},
],
如果是关系数据,您也可以使用它:
[
'attribute' => 'role_id',
'value' => function ($model, $key, $index, $column) {
return $model->role->name;
},
],
$model 是当前显示的用户实例。
在Guide 中阅读有关 GridView 列的更多信息。
【讨论】:
如果是关系数据,我会在@Bizley 解决方案中添加一个补充:
[
'attribute' => 'role_id',
'value' => function ($model, $key, $index, $column) {
return $model->role->name;
},
],
别忘了进行预加载,你应该在搜索功能中加入UsersSearch
$query = Users::find()->with('role');// eager loading
而不是
$query = Users::find();// lazy loading
对于过滤角色名称添加
[
'attribute' => 'role_id',
'value' => function ($model, $key, $index, $column) {
return $model->role->name;
},
'filter'=>ArrayHelper::map(\app\models\Role::find()
->asArray()- >all(), 'id', 'name')
],
这将在过滤中添加一个包含所有角色名称的组合框,如果您想要输入文本过滤选项,还有另一种方法:
删除上面添加的过滤选项:
[
'attribute' => 'role_id',
'value' => function ($model, $key, $index, $column) {
return $model->role->name;
},
],
用 joinWith 代替 with
$query = Users::find()->joinWith('role');
'role' => $this->role, 并替换为->andFilterWhere(['like', 'roles.name', $this->role])
【讨论】: