Как отсортировать поля из таблицы отношений в Yii?


Я пытаюсь реализовать сортировку в виде списка Yii. Я присоединил 2 таблицы с именами provider_favourite и service_request в виде списка. И поля и содержимое из обеих таблиц перечислены в представлении списка. Но сортировка работает только в таблице provider_favourite, а не в таблице service_request. Как я могу отсортировать поля из таблицы service_request? Я использую csort для сортировки. Я также попробовал представление CGrid. Но та же проблема возникает и в представлении сетки.
Я использую следующий код для присоединения

 $criteria = new CDbCriteria;
    $criteria->select = 'favourite_notes,favourite, favourite_added_date,max_budget,preferred_location,service_name';
    $criteria->join = 'LEFT JOIN service_request AS s ON  service_request_id = favourite';
    $criteria->condition = 'favourite_type = 1';
    $sort=new CSort('ProviderFavourite');
 //        $sort->defaultOrder='s.max_budget ';
    $sort->applyOrder($criteria);
    $sort->attributes = array(
            'max_budget' => 'service_request.max_budget',
            'service_name' => 'service_request.service_name',
            'favourite_added_date'
    );
        $type = 2;
    $data = new CActiveDataProvider('ProviderFavourite', array('criteria' => $criteria, 'pagination' => array('pageSize' => 4),'sort'=>$sort
            ));
    $this->renderPartial('favourites', array(
        'ModelInstance' => ProviderFavourite::model()->findAll($criteria),
        'dataProvider' => $data, 'type' => $type, 'sort'=>$sort,
    ));

а также я предоставляю сортируемые атрибуты в виде списка

 $this->widget('zii.widgets.CListView', array('dataProvider'=>$dataProvider,'itemView'=>'index_1',     
         'id'=>'request',
         'template' => '  {items}{pager}',
         'sortableAttributes'=>array('favourite_notes','max_budget','service_name')
 )); 

Если нужно больше деталей, я предоставлю. заранее спасибо


person anu    schedule 17.04.2013    source источник


Ответы (2)


Вы должны указать свойство attributes вашего экземпляра $sort. По умолчанию только поля $modelClass (ProviderFavourite в вашем случае) являются сортируемыми.

Я думаю, что это может выглядеть так (не проверено):

$sort->attributes = array(
    'service_name' => array(
        'asc' => 's.service_name ASC',
        'desc' => 's.service_name DESC'
    ),
    // ...another sortable virtual attributes from service_request table
    "*"
);
person ezze    schedule 17.04.2013
comment
Думаю, я его предоставил. Не могли бы вы проверить мой вопрос. Я обновил код. Но та же проблема проявляется. Курсор меняется при наведении на него и при нажатии , страница так же перезагружается. Но сортировка не происходит - person anu; 17.04.2013
comment
В документации по sortableAttributes говорится, что для того, чтобы атрибут сортируемый, он также должен отображаться как сортируемый атрибут в свойстве IDataProvider::sort элемента dataProvider. Другими словами, этот атрибут должен быть объявлен для сортировки в attributes свойстве CSort. - person ezze; 17.04.2013
comment
Сам экземпляр CSort также может быть объявлен с использованием свойства sort объекта CActiveDataProvider, как показано здесь. - person ezze; 17.04.2013

Вы не должны создавать объект CSort в $sort. CActiveDataProvider уже предоставит вам правильный объект сортировки. Как вы это делаете, вы применяете критерии сортировки к $criteria перед настройкой атрибутов сортировки. Это не может работать.

Вместо этого вы должны попробовать простую настройку, подобную этой:

$data = new CActiveDataProvider('ProviderFavourite', array(
    'criteria' => $criteria, 
    'pagination' => array('pageSize' => 4),
    'sort'=> array(
        'attributes' => array(
            'service_name' => array(
                'asc' => 's.service_name ASC',
                'desc' => 's.service_name DESC'
           ),
           // ...
    ),
));

Если вам нужно получить доступ к связанному объекту CSort (чего вы обычно не делаете, если используете CGridView или CListView, потому что они занимаются этим за вас), вы можете получить его через $data->sort.

person Michael Härtl    schedule 17.04.2013