2016-10-03 2 views
1

Скажем, у меня есть несколько цветных шаров, созданных в разное время, которые я хочу отобразить в GridView.Yii2 Gridview: как сортировать по нескольким столбцам?

  • Ball - идентификатор, цвет, created_at

Населенные как:

1, red , 2010-10-09 
2, blue , 2010-11-08 
3, blue , 2010-09-01 
4, red , 2010-06-15 

В умолчанию я хочу шары, которые будут отображаться новейшими первыми, но я также хочу, чтобы иметь возможность сделать заказ шарики по цвету, поэтому я настроил следующую функцию поиска в модели BallSearch:

public function search() 
{ 
    $query = Ball::find(); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
     'sort' => [ 
      'attributes' => [ 
       'color', 
       'created_at', 
      ], 
      'defaultOrder'=> ['created_at' => SORT_DESC] 
     ], 
    ]); 

    return $dataProvider; 
} 

Это работает до определенной точки, но при сортировке по цвету я понимаю, что теряю новейшую первую сортировку. Я бы на самом деле, как этот результат:

2, blue , 2010-11-08 
3, blue , 2010-09-01 
1, red , 2010-10-09 
4, red , 2010-06-15 

К сожалению, если я поставил новейшее первое условие находки запроса:

... 
$query = Ball::find()->orderBy(['created_at' => SORT_DESC]); 
... 

Он не будет применяться до порядка сортировки и результаты больше не заказанной по цвету в первую очередь и упорядочение GridView неэффективно.

Есть ли способ указать это второстепенное упорядочение без согласования сложных условий с каждым порядком атрибутов?

Мне кажется, что это обычный прецедент.

ответ

1

Вы можете просто попробовать:

'sort' => [ 
    'attributes' => [ 
     'color' => [ 
      'asc' => ['color' => SORT_ASC, 'created_at' => SORT_DESC], 
      'desc' => ['color' => SORT_DESC, 'created_at' => SORT_ASC], 
     ], 
     'created_at', 
    ], 
    'defaultOrder'=> ['created_at' => SORT_DESC] 
], 

Подробнее о Sorting.

+0

Красивый, работает как сон .. спасибо! – Arth

Смежные вопросы