【问题标题】:Yii2 GridView default order by CASE WHENYii2 GridView 默认顺序按 CASE WHEN
【发布时间】:2016-01-29 09:06:02
【问题描述】:

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

(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,
    ],
],

有什么方法可以使这种默认排序工作,并且仍然保持正确使用按列名进行网格排序的能力?

【问题讨论】:

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


    【解决方案1】:

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

    我在打开视图的控制器方法中定义查询。所以我添加了一个条件来检查 sort 参数是否传递给 get 请求。如果通过,我将创建不带ORDER BY 子句的查询。如果未传递排序参数(未进行列排序),我将使用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');     
    }   
    

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 2016-02-10
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多