首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >时,Yii2 GridView按情况默认排序

时,Yii2 GridView按情况默认排序
EN

Stack Overflow用户
提问于 2016-01-29 09:06:02
回答 1查看 2.6K关注 0票数 0

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

代码语言:javascript
复制
(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子句中,那么所有其他排序选项都无法工作,因为此条件已应用于查询本身。

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

代码语言:javascript
复制
'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,
    ],
],

是否有任何方法使此默认排序工作,并仍然能够保持正确使用网格排序的列名?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-29 09:29:00

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

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

代码语言:javascript
复制
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');     
}   
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35080592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档