Yii Framework 2.0 GridView和来自连接表的数据

时间:2014-09-25 14:46:34

标签: php gridview yii2

我有两个数据库表'user'和'role'。我使用Yii framework 2.0 Gii用User模型和UserSearch模型创建CRUD。默认情况下,Gii使用GridView :: widget作为“用户”模型的索引页面。

在UserSearch模型内部的搜索($ params)方法中,我使用以下代码将上述表连接在一起

$query = User::find()->with('role');

查询一切正常。

默认情况下,Gii不包含来自views / user / index.php页面内GridView :: widget中的连接表'role'的数据。通过上面的连接查询,我可以从两个表中检索数据。在views / user / index.php页面中,我使用以下代码注入了GridView :: widget,以便它还包括连接表(角色)中的数据和列名。

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        'userid',
        'username',
        'role.role_name',
        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

使用GridView :: widget中包含的角色数据'role_name,一切正常。但问题是role_name没有搜索框。 GridView :: widget仅为User属性创建搜索框。有没有办法为联接表'role'的属性添加搜索框,因为我还想搜索'role_name'以及User模型的其他属性。

6 个答案:

答案 0 :(得分:3)

尝试这种方式:

在您的UserSearch模型中添加

UserSearch extends ...
{
    public $roleFilterInputName; //the name of the filter search input

    //important
    function rules()
    {
        //add roleFilterInputName as safe
        return [
            [['xxx', 'roleFilterInputName'], 'safe'], //!!!!
        ];
    }
}
你网格中的

'columns':
[
    //...
    [
    'attribute' => 'roleFilterInputName',
    'value' => 'role.role_name'
    ],
    //...
]

在UserSearch :: search()

$query->andFilterWhere(['like', 'role.role_name', $this->roleFilterInputName])

但我想你必须使用'joinWith'代替'with'。

答案 1 :(得分:1)

  1. 在CGridView里面添加以下代码。它将使用dropDownList启用过滤器。

       [
            'attribute' => 'act_role_id',
            'label' => 'Actor Role',
            'value' => 'actRole.role_name',
            'filter' => yii\helpers\ArrayHelper::map(app\models\ActorRole::find()->orderBy('role_name')->asArray()->all(),'act_role_id','role_name')
        ],
    
  2. CGridView代码片段如下:

       <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
    
            'userid',
            'username',
            [
                'attribute' => 'act_role_id',
                'label' => 'Actor Role',
                'value' => 'actRole.role_name',
                'filter' => yii\helpers\ArrayHelper::map(app\models\ActorRole::find()->orderBy('role_name')->asArray()->all(),'act_role_id','role_name')
            ],
            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>
    

答案 2 :(得分:0)

尝试

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        'userid',
        'username',

        //'role.role_name',
        ['attribute' => 'role', 'value' => 'role.role_name'],

        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

我刚刚在我的代码中尝试过,所以我不确定这是否适用于您的代码。但如果是这样,我不知道为什么必须这样定义。

我猜rajesh ujade的答案也包含了Yii 1的定义。

答案 3 :(得分:0)

这对我有用 表= Lead(id,year_id) 表=年(id,文本)

在铅中添加了文字(index.php) Year :: find() - &gt; all()=此代码从table / all years中提取所有值。

            [
            'attribute'=> 'year_id',
            'format' => 'html',
            'value' => 'year.value',
            'label' => 'Year',
            'filter' => Html::activeDropDownList($searchModel, 'year', yii\helpers\ArrayHelper::map(Year::find()->all(), 'year_id', 'value'), ['class' => 'form-control', 'prompt' => '---']),

        ],

它还显示下拉列表以及排序。

image Showing Dropdown in Grdiview

答案 4 :(得分:0)

@Ekonoval正在以正确的方式进行。

只需在UserSearch的serch函数中添加以下内容:

在初始化ActiveDataProvider对象之后:

$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'pagination' => [
        'pageSize' => 5,
    ],
]);

$dataProvider->sort->attributes['roleFilterInputName'] = [
    'asc' => ['role.role_name' => SORT_ASC],
    'desc' => ['role.role_name' => SORT_DESC]
];

答案 5 :(得分:0)

您可以在UserSearch模型中编写查询,如

if($this->role)
{
   $query->join('LEFT JOIN','role','role.user_id =   user.id')->andFilterWhere(['role.item_name' => $this->role]);
}