在CakePHP分页中排序asc然后为空

时间:2017-11-10 11:25:21

标签: php mysql cakephp pagination

我在cakePHP中有这段代码

$this->paginate = [
        'sortWhitelist' => [
            'Companies.name',
            'Grants.shortname',
            'amount',
            'contact',
            'LatestHistory.Histories__deadline',
            'Statuses.name'
        ],
        'order' => [
            'LatestHistory.Histories__deadline' => 'ASC',
            'Statuses.await' => 'DESC',
            'Statuses.name'
        ]
    ];

按照历史截止日期ASC排序,但是空值首先出现,而其他记录的历史记录,其中历史记录截止日期不为空。如果ASC列表位于第一位,我想,而不是空值。我该如何解决这个问题?

由于

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

$this->paginate = [
    'sortWhitelist' => [
        'Companies.name',
        'Grants.shortname',
        'amount',
        'contact',
        'LatestHistory.Histories__deadline',
        'Statuses.name'
    ],
    'order' => [
        '-LatestHistory.Histories__deadline' => 'DESC',
        'Statuses.await' => 'DESC',
        'Statuses.name'
    ]
];

注意LatestHistory.Histories__deadline前面的减号和DESC反转顺序。

MySQL Orderby a number, Nulls last中描述了这种技术。

答案 1 :(得分:0)

您可以在查询中使用两个order by条件来执行此操作: -

ORDER BY LatestHistory.Histories__deadline is null, LatestHistory.Histories__deadline ASC

第一个order by通过按语句返回truefalse来对语句进行排序。

所以你的Cake paginate查询看起来像: -

$this->paginate = [
    'sortWhitelist' => [
        'Companies.name',
        'Grants.shortname',
        'amount',
        'contact',
        'LatestHistory.Histories__deadline',
        'Statuses.name'
    ],
    'order' => [
        'LatestHistory.Histories__deadline is null',
        'LatestHistory.Histories__deadline' => 'ASC',
        'Statuses.await' => 'DESC',
        'Statuses.name'
    ]
];

或者使用CASE WHEN: -

ORDER BY CASE WHEN LatestHistory.Histories__deadline IS NOT NULL THEN 1 ELSE 2 END, LatestHistory.Histories__deadline ASC