Страница 1 из 1
Сортировка по связанному полю в GridView
Добавлено: 2018.04.17, 08:45
Alex_N
Всем привет, подскажите пожалуйста. Как в GridView отсортировать по умолчанию по связанному полю?
В этой теме нашел как отсортировать по несвязанному полю:
https://yiiframework.ru/forum/viewtopic.php?t=22901
Спасибо.
Re: Сортировка по связанному полю в GridView
Добавлено: 2018.04.17, 09:05
Alexum
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.
]
]);
...
Re: Сортировка по связанному полю в GridView
Добавлено: 2018.04.17, 19:54
Alex_N
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];