【问题标题】:How to retrieve other parameter instead of id in gridview and detailview yii2?如何在gridview和detailview yii2中检索其他参数而不是id?
【发布时间】:2016-08-09 05:19:29
【问题描述】:

在“角色”、“职位”、“部门”列中,您会看到这些数据库表“角色”、“职位”、“部门”的 ID。

如何粘贴名称而不是 ID?

提前致谢。

【问题讨论】:

  • 你需要关系表数据还是不同的表数据?
  • 是的,关系。 “role”表中的id等于“user”表中的role_id
  • 你检查我的答案了吗?

标签: php list yii2 multi-select dropdown


【解决方案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']);
}

【讨论】:

  • 我将 $data->relation_table->field_name 更改为 $data->role->name 并显示:“获取未知属性:backend\models\User::role”。
  • 首先检查用户模型中是否存在关系。
【解决方案2】:

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

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 列的更多信息。

【讨论】:

  • 是否可以在不使用 switch 硬编码的情况下实现这个逻辑?我的意思是自动粘贴角色的名称而不是 id。我不想限制角色,因为我对这些以及职位和部门都有粗略的了解
  • 我已经给了你 3 个选项:硬编码、静态方法和关系表。你不限于这些。
【解决方案3】:

如果是关系数据,我会在@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');
    
    • 在 UsersSearch rules 中将角色从整数更改为安全
    • 在 搜索 功能中删除 'role' => $this->role, 并替换为
      ->andFilterWhere(['like', 'roles.name', $this->role])

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 2016-07-13
    • 2016-03-24
    • 2015-08-11
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2015-12-22
    • 2013-04-19
    相关资源
    最近更新 更多