Yii Framework Forum: Сортировка В Cgridview По Внешнему Полю - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

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

#1 User is offline   GTAlex 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 11
  • Joined: 11-December 13

  Posted 11 December 2013 - 02:45 AM

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

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

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

#2 User is offline   andy_s 

  • Random Member Title
  • Yii
  • Group: Moderators
  • Posts: 1,526
  • Joined: 22-June 09
  • Location:Russia, Kostroma

Posted 11 December 2013 - 03:12 AM

Метод 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". Эти поля соответствуют полям в связанной таблице.
1

#3 User is offline   andy_s 

  • Random Member Title
  • Yii
  • Group: Moderators
  • Posts: 1,526
  • Joined: 22-June 09
  • Location:Russia, Kostroma

Posted 11 December 2013 - 03:35 AM

Вот так:

array(
   'name' => 'search_street',
   'value'=>'...'
),


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

#4 User is offline   GTAlex 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 11
  • Joined: 11-December 13

Posted 11 December 2013 - 04:18 AM

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

Quote

сделать их "safe" для сценария "search".

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

Quote

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

добавил в 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'.

Quote

Потребуется добавить в модель поля searchFullName, searchRegion и т.д.

Тут неясно :(

Моя модель 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 :(
0

#5 User is offline   GTAlex 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 11
  • Joined: 11-December 13

Posted 11 December 2013 - 04:30 AM

Упустил подключение таблицы
$criteria->with = array('street');


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

Итак, по порядку:
1. во вьюшку добавляем колонку с именем search_street и отображаемыми релационными данными:
array(
  'name' => 'search_street',
  'value'=>'$data->street->name'
),

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

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

class Arenda extends CActiveRecord {

public $search_street;


3. Добавляем в rules() правило с полем search_street в safe для search
array('search_street, id, title, .....', 'safe', 'on'=>'search'),

4. В самом search() добавляем связанную таблицу и связь между search_street и именем
$criteria->with = array('street');
$criteria->compare('street.name',$this->search_street, true);

0

#6 User is offline   andy_s 

  • Random Member Title
  • Yii
  • Group: Moderators
  • Posts: 1,526
  • Joined: 22-June 09
  • Location:Russia, Kostroma

Posted 11 December 2013 - 04:46 AM

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

#7 User is offline   GTAlex 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 11
  • Joined: 11-December 13

Posted 12 December 2013 - 04:11 AM

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

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

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users