Сортировка В Cgridview По Внешнему Полю

Здравствуйте!

Подскажите как можно в CGridView сделать сортировку по внешнему связанному полю для адреса (город, район, улица)

Причём в идеале - при вводе улицы - возможность быстрого выбора по уже введённым символам "пет" => "петухова, петренко, и т.п. …"

или хотя-бы по вхождению (чтоб работало так же, как будто это не внешнее поле - а строковое)

Метод search() одной из моделей, где у меня есть сортировка и поиск по связанным полям:




public function search($modelPerPage = 50)

{

    $criteria = new \CDbCriteria;

    $criteria->with = array('user', 'test');


    $criteria->compare('users.full_name', $this->searchFullName, true);

    $criteria->compare('users.region', $this->searchRegion, true);

    $criteria->compare('users.staff', $this->searchStaff);

    $criteria->compare('t.points', $this->points);


    return new \CActiveDataProvider(get_class($this), array(

        'criteria'=>$criteria,

        'sort'=>array(

            'attributes'=>array(

                'searchFullName'=>array(

                    'asc'=>'users.full_name',

                    'desc'=>'users.full_name DESC',

                ),

                'searchRegion'=>array(

                    'asc'=>'users.region',

                    'desc'=>'users.region DESC',

                ),

                '*',

            ),

        ),

        'pagination'=>array(

            'pageSize'=>$modelPerPage,

        ),

    ));

}



Потребуется добавить в модель поля searchFullName, searchRegion и т.д. и сделать их "safe" для сценария "search". Эти поля соответствуют полям в связанной таблице.

Вот так:




array(

   'name' => 'search_street',

   'value'=>'...'

),



Так id или имя улицы будет попадать в поле search_street модели, и в search() нужно добавить соответствующий код, чтобы находить модели с этим значением.

Сразу сорри за тупизм - 2й день изучения Yii … но всё же:

тут ясно - просто дописать search_street

сделал

добавил в search() такую запись


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

тут сильно сомневаюсь в сделанном т.к. в таком случае полученное значение в search_street будет именно искать по $this->id_street


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

Так имхо более правильно - т.е. $this->search_street сопоставляется с street.name

но так вообще ошибку даёт на уровне MySQL

Error 500: … Unknown column ‘street.name’ in ‘where clause’.

Тут неясно :(

Моя модель arenda (где исползуются айдишники id_street связанной таблицы street c полями "id" и "name"

это class Arenda extends CActiveRecord - т.е. поля таблицы и есть поля модели…

плюс реляционная связь в relations()

‘street’=>array(self::BELONGS_TO, ‘Street’, ‘id_street’),

добавить в модель поля search_street - это = добавить это поле в таблицу arenda - мне этого не нужно, таблица содержит id_street - этого для связи вполне достаточно

добавить public $search_street; ? - так не пашет

без него даёт ошибку "Property "Arenda.search_street" is not defined. "

help :(

Упустил подключение таблицы


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

Так уже видимо должно работать, но не работает :(

Итак, по порядку:

  1. во вьюшку добавляем колонку с именем search_street и отображаемыми релационными данными:



array(

  'name' => 'search_street',

  'value'=>'$data->street->name'

),



всё ок - поле для фильтрации добавилось, данные выводятся верно, но пока не фильтрует

  1. Добавляем поле в модель

class Arenda extends CActiveRecord {


public $search_street;



  1. Добавляем в rules() правило с полем search_street в safe для search

array(‘search_street, id, title, …’, ‘safe’, ‘on’=>‘search’),

  1. В самом search() добавляем связанную таблицу и связь между search_street и именем

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

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

А какая ошибка в итоге? Если из-за street.name, то, видимо, алиас таблицы не street… Хотя по умолчанию он соответствует названию связи в relations().

Всё пошло, спасибо большое, ошибки не было, просто не мог написать в форум - всего 3 сообщения в первый день на форуме, исправить тоже не получалось.

Ещё раз - andy_s - огромное спасибо!