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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Alex_N
Сообщения: 45
Зарегистрирован: 2015.03.02, 21:20

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

Сообщение Alex_N » 2018.04.17, 08:45

Всем привет, подскажите пожалуйста. Как в GridView отсортировать по умолчанию по связанному полю?

В этой теме нашел как отсортировать по несвязанному полю:
https://yiiframework.ru/forum/viewtopic.php?t=22901

Спасибо.

Аватара пользователя
Alexum
Сообщения: 582
Зарегистрирован: 2016.09.26, 10:00

Re: Сортировка по связанному полю в GridView

Сообщение Alexum » 2018.04.17, 09:05

1) в поисковой модели подключаете связь через joinWith()
2) в DataProvider определяете настройки sort, где указываем, по какому атрибуту нужно осуществлять сортировку и затем указываем default order

Н-р: представим, что у агента может быть один план продаж, id которого храним в агентах в agent_salesplan_id. Нужно показать агентов и отсортировать по названию плана продаж, а затем по их ФИО.

Код: Выделить всё

$query = Agents::find()->joinWith(['agentSalesplan']);
...
   $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [
                'attributes' => [
                     'agent_id' => [  // Например, мы можем изменить поведение сортировки для атрибута из основной модели
                        'asc' => ['agent_full_name' => SORT_ASC],
                        'desc' => ['agent_full_name' => SORT_DESC],
                    ],
                    'agent_salesplan_id' => [   // атрибут основной модели
                        'asc' => ['salesplan_name' => SORT_ASC, 'agent_id' => SORT_ASC], // salesplan_name - Атрибут из связанной модели
                        'desc' => ['salesplan_name' => SORT_DESC, 'agent_id' => SORT_ASC], // salesplan_name - Атрибут из связанной модели
                    ],
               ],
               'defaultOrder' => ['agent_salesplan_id' => SORT_ASC, 'agent_id' => SORT_ASC,]
               //сортировка по умолчанию будет по атрибуту salesplan_name, а затем по agent_full_name, т.к. мы задали собственные параметры сортировки для атрибутов agent_salesplan_id и agent_id.   
            ]
     ]);
...

Alex_N
Сообщения: 45
Зарегистрирован: 2015.03.02, 21:20

Re: Сортировка по связанному полю в GridView

Сообщение Alex_N » 2018.04.17, 19:54

Alexum писал(а):
2018.04.17, 09:05
1) в поисковой модели подключаете связь через joinWith()
2) в DataProvider определяете настройки sort, где указываем, по какому атрибуту нужно осуществлять сортировку и затем указываем default order

Н-р: представим, что у агента может быть один план продаж, id которого храним в агентах в agent_salesplan_id. Нужно показать агентов и отсортировать по названию плана продаж, а затем по их ФИО.

Код: Выделить всё

$query = Agents::find()->joinWith(['agentSalesplan']);
...
   $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [
                'attributes' => [
                     'agent_id' => [  // Например, мы можем изменить поведение сортировки для атрибута из основной модели
                        'asc' => ['agent_full_name' => SORT_ASC],
                        'desc' => ['agent_full_name' => SORT_DESC],
                    ],
                    'agent_salesplan_id' => [   // атрибут основной модели
                        'asc' => ['salesplan_name' => SORT_ASC, 'agent_id' => SORT_ASC], // salesplan_name - Атрибут из связанной модели
                        'desc' => ['salesplan_name' => SORT_DESC, 'agent_id' => SORT_ASC], // salesplan_name - Атрибут из связанной модели
                    ],
               ],
               'defaultOrder' => ['agent_salesplan_id' => SORT_ASC, 'agent_id' => SORT_ASC,]
               //сортировка по умолчанию будет по атрибуту salesplan_name, а затем по agent_full_name, т.к. мы задали собственные параметры сортировки для атрибутов agent_salesplan_id и agent_id.   
            ]
     ]);
...
Спасибо! помогли разобраться! Сделал вот так:

Код: Выделить всё

$query->joinWith(['idIncKeType', 'userCreatedIncType']);
        
        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => [
                'pageSize' => 30,
            ],
        ]);
        
        $dataProvider->sort->attributes['idIncKeType'] = [
            'asc' => ['foa_inc_ke.name_inc_ke' => SORT_ASC],
            'desc' => ['foa_inc_ke.name_inc_ke' => SORT_DESC],
        ];
        
        $dataProvider->sort->attributes['userCreatedIncType'] = [
            'asc' => ['foa_user.username' => SORT_ASC],
            'desc' => ['foa_user.username' => SORT_DESC],
        ];
        
        $dataProvider->sort->defaultOrder = ['idIncKeType' => SORT_ASC];

Ответить