Yii2 Gridview:如何对多列进行排序?

Art*_*rth 3 gridview yii2

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

  • 球 - id、颜色、created_at

填充为:

1, red   , 2010-10-09
2, blue  , 2010-11-08
3, blue  , 2010-09-01
4, red   , 2010-06-15 
Run Code Online (Sandbox Code Playgroud)

默认情况下,我希望首先显示最新的球,但我也希望能够按颜色对球进行排序,因此我在 BallSearch 模型中设置了以下搜索功能:

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

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

    return $dataProvider;
}
Run Code Online (Sandbox Code Playgroud)

这在一定程度上有效,但是当按颜色排序时,我可以理解地失去了最新的第一个排序。我真的很喜欢这个结果:

2, blue  , 2010-11-08
3, blue  , 2010-09-01
1, red   , 2010-10-09
4, red   , 2010-06-15 
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果我将最新的第一个条件放在查找查询上:

...
$query = Ball::find()->orderBy(['created_at' => SORT_DESC]);
...
Run Code Online (Sandbox Code Playgroud)

它在排序之前应用,结果不再主要按颜色排序,并且 GridView 排序无效。

无论如何,是否可以在不将复杂的条件连接到每个属性顺序的情况下指定这种底层的二级排序?

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

soj*_*oju 5

你可以简单地尝试:

'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]
],
Run Code Online (Sandbox Code Playgroud)

阅读更多关于排序