CGridView сортировка и поиск по связанному полю

Проблема в том что я не могу понять как сделать так что бы искало по зависимому полю и также могло сортировать по нему. Подскажите как сделать.

У меня две таблицы

[sql]CREATE TABLE code (

id int(11) NOT NULL auto_increment,

value varchar(10) default NULL,

PRIMARY KEY (id),

KEY value (value)

) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=cp1251;

CREATE TABLE notice (

id int(11) NOT NULL auto_increment,

code_id int(11) NOT NULL,

surname varchar(70) NOT NULL,

name varchar(70) NOT NULL,

middle varchar(70) NOT NULL,

city varchar(70) NOT NULL,

status varchar(70) NOT NULL,

PRIMARY KEY (id),

KEY code_id (code_id)

) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=cp1251;[/sql]

В модели notice


public function relations()

{

    return array(

       'uid'=>array(self::BELONGS_TO, 'сode', 'code_id'),

    );

}


public function search()

{

    $criteria=new CDbCriteria;

    $criteria->compare('surname',$this->surname,true);

    $criteria->compare('name',$this->name,true);

    $criteria->compare('middle',$this->middle,true);

    $criteria->compare('city',$this->city,true);

    $criteria->compare('status',$this->status,true);

    return new CActiveDataProvider('notice', array(

        'criteria'=>$criteria,

    ));

}



Выводится в отображении вот так ($model=new notice(‘search’))


$this->widget('zii.widgets.grid.CGridView', array(

    'id'=>'notice-grid',

    'dataProvider'=>$model->search(),

    'filter'=>$model,

    'columns'=>array(

        array(

            'name'=>'uid',

            'value'=>'$data->uid->value',

            'sortable'=>true,

        ),

        'surname',

        'name',

        'middle',

        'city',

        'status',

        array(

            'class'=>'CButtonColumn',

        ),

    ),

));

Определите


'sort'=>array('attributes'=>array(

  'relatedField'=>array(

    'asc' => $expr='SOME SQL EXPRESSION',

    'desc' => $expr.' DESC',

  ),

  ...

  ...

  ...

для связанного поля (в CActiveDataProvider), т.е.


$dataProvider->sort=array('attributes'=>array(...));

Так не работает. Объясните поподробнее.


public function search()

{

    $criteria=new CDbCriteria;

    $criteria->compare('surname',$this->surname,true);

    $criteria->compare('name',$this->name,true);

    $criteria->compare('middle',$this->middle,true);

    $criteria->compare('city',$this->city,true);

    $criteria->compare('status',$this->status,true);

    return new CActiveDataProvider('notice', array(

        'criteria'=>$criteria,

        'sort'=>array('attributes'=>array(

            'uid'=>array(

                'asc' => $expr='SOME SQL Expression',

                'desc' => $expr.' DESC',

            ),

        )),

    ));

}

Так, с поиском разобрался.

добавил несколько строчек в функцию search()


$criteria->with=array('uid');

$criteria->compare('uid.value',$this->uid,true);

и прописал атрибут ‘uid’ как safe.

Но остался вопрос про сортировку :huh:

vamp я вас не навижу :D - ‘SOME SQL Expression’. Нельзя же так издеваться над доверчивыми людьми.


public function search()

{

    $criteria=new CDbCriteria;

    $criteria->compare('surname',$this->surname,true);

    $criteria->compare('name',$this->name,true);

    $criteria->compare('middle',$this->middle,true);

    $criteria->compare('city',$this->city,true);

    $criteria->compare('status',$this->status,true);


    $criteria->with=array('uid');

    $criteria->compare('uid.value',$this->uid,true);


    return new CActiveDataProvider('notice', array(

        'criteria'=>$criteria,

        'sort'=>array('attributes'=>array(

            'uid'=>array(

                'asc' => $expr='uid.value',

                'desc' => $expr.' DESC',

            ),

        )),

    ));

}

Тем не менее спасибо.

Рад, что у вас все получилось ;) (это не издевка, а лишь попытка заставить человека понимать код) :rolleyes: