Search code examples
yiiyii-relations

How to sort and search in a CGridView column with a two-level 1-N relation?


This question directly follow this other

I have this tables: Groups, Users, Reports

Relations: Groups 1 -> N Users ** and ** Users 1 -> N Reports

I already have this relation In Report model:

'user' => array(self::BELONGS_TO, 'Users', 'userId'),

And this in User model

'group' => array(self::BELONGS_TO, 'Gruppi', 'groupId'),

In Report Model I have this:

$criteria=new CDbCriteria;
$criteria->with = array ('user');

In the admin view of report I'm using a CGridView.

I'm using user.group.name for showing group name, but how to search (by DropDown) and sort !?


Solution

  • In admin view, instead of user.group.name, i'm using

    array (
            'name' => 'groupId',
            'value' => '$data->user->group->name',
            'filter' => Chtml::listData( Groups::model()->findAll() ,'id','name')
        ),
    

    In Report model I added a class field

    public $groupId;
    

    In Report rules

        array('groupId','safe','on'=>'search'),
    

    In Report search

    ....
    $criteria->with = array ('user.group');
    ....
    $criteria->compare('user.groupId',$this->groupId);
    ....
    [in sort array]
    'groupId'=>array(
                'asc' =>'group.name',
                    'desc'=>'group.name DESC',
     ),
    

    In this way I can search, and sort, by group name !

    I hope this post can be usefull to someon