Laravel中按created_at与delivery_from排序结果不符的解决方法
问题分析与解决方案
嘿,我一眼就瞅出问题所在啦!你想要的是先按created_at升序(更早的订单排在前面),同一日期内再按delivery_from升序,但当前代码里给created_at用了desc(降序),这直接把日期晚的订单顶到前面去了,完全和你的预期反着来。
修正后的代码
把created_at的排序方向改成asc就搞定了:
$store = auth('manager')->user->store; $orders = $store->orders() ->orderBy('created_at', 'asc') // 这里从desc改成asc ->orderBy('delivery_from', 'asc') ->get();
为什么这样改?
- 第一个
orderBy('created_at', 'asc')会先把所有订单按创建日期从早到晚排序(比如10/10/2018的订单会排在15/10/2018的前面) - 第二个
orderBy('delivery_from', 'asc')会在同一个创建日期的订单组内,按配送起始时间从早到晚排序(比如同一日期下10:00的订单会排在12:00之前)
执行这个代码后,查询结果就会和你给出的预期示例完全一致:
delivery_from: 10:00, created_at: 10/10/2018 delivery_from: 12:00, created_at: 10/10/2018 delivery_from: 09:00, created_at: 15/10/2018 delivery_from: 15:00, created_at: 15/10/2018
额外小提示
你的created_at是Laravel默认的timestamp类型(包含日期和具体时间),如果业务里需要只按日期部分排序(忽略时分秒),可以用数据库函数处理一下:
->orderBy(DB::raw('date(created_at)'), 'asc')
不过看你的示例只展示了日期,默认的created_at升序已经能满足需求,除非同一日期内有不同时间的订单需要忽略时间维度排序。
内容的提问来源于stack exchange,提问作者Paul Diamant
相关产品推荐
相关产品推荐

