Laravel中如何按日期排序同时将status为Completed的记录排在列表末尾
解决方案
方式1:SQL层面排序(推荐)
直接在查询构造器中新增自定义排序规则,优先按状态优先级排序,再按end_at升序,执行效率更高,适合所有数据量场景:
$this->paperorders = paperorder::with('order', 'client', 'paperorders', 'papers', 'stocks') ->orderByRaw("CASE WHEN status = 'Completed' THEN 1 ELSE 0 END ASC") ->orderBy('end_at', 'asc') ->get();
实现逻辑说明
- 第一步用
CASE WHEN自定义排序权重:status为Completed的记录权重设为1,其余Processing状态的权重设为0,按权重升序排列后所有Processing记录会自动排在Completed记录前面 - 第二步按
end_at升序排列,保证同一状态下的记录按结束日期升序排序,和原有的排序逻辑一致
方式2:集合层面排序(适合小数据集)
如果需要在拿到查询结果集合后再做排序,可直接用Laravel集合的sortBy方法实现:
$this->paperorders = paperorder::with('order', 'client', 'paperorders', 'papers', 'stocks') ->get() ->sortBy(function ($record) { return [ $record->status === 'Completed' ? 1 : 0, $record->end_at ]; });
内容的提问来源于stack exchange,提问作者Madushan Serasinghe
相关产品推荐
相关产品推荐

