Yii2 Gridview:如何在多个列上排序?

Yii2 Gridview:如何在多个列上排序?,gridview,yii2,Gridview,Yii2,假设我有许多在不同时间创建的彩色球,我希望在GridView中显示这些球 球-id,颜色,创建于 填充为: 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 = B

假设我有许多在不同时间创建的彩色球,我希望在GridView中显示这些球

  • 球-id,颜色,创建于
填充为:

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 
不幸的是,如果我在find查询中设置了最新的第一个条件:

...
$query = Ball::find()->orderBy(['created_at' => SORT_DESC]);
...
它在排序之前应用,结果不再主要按颜色排序,GridView排序无效

是否可以在不将复杂条件包含到每个属性顺序的情况下指定此基础二级顺序

在我看来,这是一个常见的用例

您可以简单地尝试:

'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]
],
阅读更多关于