Yii2 GridView默认顺序由CASE WHEN

时间:2016-01-29 09:06:02

标签: sorting gridview yii2 sql-order-by case

我正在使用GridView来显示一些数据。我需要按如下两列添加默认排序:

(CASE
    WHEN (inbound_datetime IS NULL AND outbound_datetime < NOW()) OR (inbound_datetime IS NOT NULL AND inbound_datetime < NOW())
        THEN 9999
    WHEN (inbound_datetime IS NOT NULL AND outbound_datetime < NOW())
        THEN inbound_datetime
        ELSE outbound_datetime
END) ASC

如果我在数据提供程序查询的ORDER BY子句中添加此代码,则所有其他排序选项都不起作用,因为此条件适用于查询本身。

我尝试将默认排序应用于任何其他网格,但它不起作用(该方法搜索具有该名称的属性):

'sort' => [
    'defaultOrder' => [
        '(CASE
            WHEN (inbound_datetime IS NULL AND outbound_datetime < NOW()) OR (inbound_datetime IS NOT NULL AND inbound_datetime < NOW())
                THEN 9999
            WHEN (inbound_datetime IS NOT NULL AND outbound_datetime < NOW())
                THEN inbound_datetime
                ELSE outbound_datetime
        END)' => SORT_ASC,
    ],
],

有没有办法让这个默认排序工作,并仍然能够正确使用列名称进行网格排序?

1 个答案:

答案 0 :(得分:0)

我做了更多的思考,并提出了解决这个问题的方法。

我在我的控制器方法中定义查询,打开视图。所以我添加了一个条件,检查是否将sort参数传递给get请求。如果它被传递,我创建没有ORDER BY子句的查询。如果未传递sort参数(未进行列排序),则使用ORDER BY子句创建查询。 在我的控制器方法中:

if (Yii::$app->request->get('sort')) {
    $query = Travel::find();
} else {
    $query = Travel::find()
        ->orderBy('(CASE
            WHEN (inbound_datetime IS NULL AND outbound_datetime < NOW()) OR (inbound_datetime IS NOT NULL AND inbound_datetime < NOW())
                THEN 9999
            WHEN (inbound_datetime IS NOT NULL AND outbound_datetime < NOW())
                THEN inbound_datetime
                ELSE outbound_datetime
        END) ASC');     
}