如何在gridview和detailview yii2中检索其他参数而不是id?

时间:2016-08-09 05:19:30

标签: php list yii2 multi-select dropdown

在“角色”,“职位”,“部门”列中,您可以看到这些数据库表格的标识符#34;角色","位置","部门"。 GridView

如何粘贴名称而不是ID?

提前致谢。

3 个答案:

答案 0 :(得分:1)

使用匿名函数更改属性的值。而不是简单的

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当前显示为User的实例。

Guide中了解有关GridView列的更多信息。

答案 1 :(得分:1)

对于详细信息视图,请检查模型中的关系并使用您喜欢的关系: -

'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']);
}

答案 2 :(得分:0)

在有关系数据的情况下,我会在@Bizley解决方案中添加一个内容:

[
    'attribute' => 'role_id',

    'value'     => function ($model, $key, $index, $column) {
        return $model->role->name;
    },
],

不要忘记进行急切的加载,您应该将 UsersSearch 添加到 search 函数

 $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代替

    $query = Users::find()->joinWith('role');
    
    • UsersSearch 规则中,将角色从整数更改为安全
    • search 函数中,删除'role' => $this->role,并放入
      ->andFilterWhere(['like', 'roles.name', $this->role])