在 Yii 2.0 中,基于数据提供者,列表接口排序的支持,排序规则参考禅道的实现

1、查看禅道的任务列表页面,其排序默认为基于 ID 降序排列,如图1

图1

2、点击 消耗 字段后,三角正立显示为深色,表示当前排序为基于 消耗 升序排列,且其值相同的情况下,再基于 ID 升序排列,如图2

图2

3、再次点击 消耗 字段后,三角倒立显示为深色,表示当前排序为基于 消耗 降序排列,且其值相同的情况下,再基于 ID 降序排列,如图3

图3

4、如果希望恢复至默认排序,即基于 ID 降序排列,则点击 2 次 ID 字段后(第 1 次为升序,第 2 次为降序),三角倒立显示为深色,表示当前排序为基于 ID 降序排列,如图4

图4

5、数据提供者的相应配置如下,通过 yii\data\Sort::$defaultOrder 来指定默认的排序为基于 ID 降序排列

        return Yii::createObject([
            'class' => ActiveDataProvider::className(),
            'query' => $query,
            'pagination' => [
                'params' => $requestParams,
            ],
            'sort' => [
                'defaultOrder' => [
                    'id' => SORT_DESC,
                ],
                'params' => $requestParams,
            ],
        ]);

6、GET 请求:http://api.pcs-api.localhost/v1/plans ,生成 SQL , SQL 语句当中的 ORDER BY 子句基于 ID 降序排列,如图5

图5

SELECT `pa_plan`.* FROM `pa_plan` GROUP BY `pa_plan`.`id` ORDER BY `id` DESC LIMIT 20

7、GET 请求:http://api.pcs-api.localhost/v1/plans?sort=importance ,生成 SQL , SQL 语句当中的 ORDER BY 子句基于 importance 升序排列(期望为基于 importance 与 id 升序排列),如图6

图6

SELECT `pa_plan`.* FROM `pa_plan` GROUP BY `pa_plan`.`id` ORDER BY `importance` LIMIT 20

8、GET 请求:http://api.pcs-api.localhost/v1/plans?sort=-importance ,生成 SQL , SQL 语句当中的 ORDER BY 子句基于 importance 降序排列(期望为基于 importance 与 id 降序排列),如图7

图7

SELECT `pa_plan`.* FROM `pa_plan` GROUP BY `pa_plan`.`id` ORDER BY `importance` DESC LIMIT 20

9、数据提供者的相应配置调整如下,通过 yii\data\Sort::$defaultOrder 来指定 id 属性的 asc(基于 id 升序排列) 和 desc(基于 id 降序排列) 元素;importance 属性的 asc(基于 importance 与 id 升序排列) 和 desc(基于 importance 与 id 降序排列) 元素;is_united 属性的 asc(基于 is_united 与 id 升序排列) 和 desc(基于 is_united 与 id 降序排列) 元素

        return Yii::createObject([
            'class' => ActiveDataProvider::className(),
            'query' => $query,
            'pagination' => [
                'params' => $requestParams,
            ],
            'sort' => [
                'defaultOrder' => [
                    'id' => SORT_DESC,
                ],
                'attributes' => [
                    'id' => [
                        'asc' => ['id' => SORT_ASC],
                        'desc' => ['id' => SORT_DESC],
                        'default' => SORT_ASC,
                        'label' => Yii::t('model/plan', 'ID'),
                    ],
                    'importance' => [
                        'asc' => ['importance' => SORT_ASC, 'id' => SORT_ASC],
                        'desc' => ['importance' => SORT_DESC, 'id' => SORT_DESC],
                        'default' => SORT_ASC,
                        'label' => Yii::t('model/plan', 'Importance'),
                    ],
                ],
                'params' => $requestParams,
            ],
        ]);

10、GET 请求:http://api.pcs-api.localhost/v1/plans ,生成 SQL , SQL 语句当中的 ORDER BY 子句基于 ID 降序排列

SELECT `pa_plan`.* FROM `pa_plan` GROUP BY `pa_plan`.`id` ORDER BY `id` DESC LIMIT 20

11、GET 请求:http://api.pcs-api.localhost/v1/plans?sort=importance ,生成 SQL , SQL 语句当中的 ORDER BY 子句基于 importance 与 id 升序排列,如图8

图8

SELECT `pa_plan`.* FROM `pa_plan` GROUP BY `pa_plan`.`id` ORDER BY `importance`, `id` LIMIT 20

12、GET 请求:http://api.pcs-api.localhost/v1/plans?sort=-importance ,生成 SQL , SQL 语句当中的 ORDER BY 子句基于 importance 与 id 降序排列,如图9

图9

SELECT `pa_plan`.* FROM `pa_plan` GROUP BY `pa_plan`.`id` ORDER BY `importance` DESC, `id` DESC LIMIT 20

13、GET 请求:http://api.pcs-api.localhost/v1/plans?sort=id ,生成 SQL , SQL 语句当中的 ORDER BY 子句基于 id 升序排列,如图10

图10

SELECT `pa_plan`.* FROM `pa_plan` GROUP BY `pa_plan`.`id` ORDER BY `id` LIMIT 20

14、GET 请求:http://api.pcs-api.localhost/v1/plans?sort=-id ,生成 SQL , SQL 语句当中的 ORDER BY 子句基于 id 降序排列,如图11

图11

SELECT `pa_plan`.* FROM `pa_plan` GROUP BY `pa_plan`.`id` ORDER BY `id` DESC LIMIT 20

15、GET 请求:http://api.pcs-api.localhost/v1/plans?sort=create_user_id ,生成 SQL , SQL 语句当中的 ORDER BY 子句基于 id 降序排列(默认排序),并未基于 create_user_id 升序排列(因为 create_user_id 属性未定义),如图12

图12

SELECT `pa_plan`.* FROM `pa_plan` GROUP BY `pa_plan`.`id` ORDER BY `id` DESC LIMIT 20
永夜