Laravel中带两个with()关联的Eloquent查询orderBy不生效如何解决
Eloquent排序失效排查方案
你的查询语句语法本身没有问题,排序不生效可按以下顺序排查:
- 检查模型全局作用域配置
如果Purchases模型定义了带排序规则的全局作用域,全局作用域的排序优先级高于单次查询的orderBy配置,可临时移除全局作用域验证:
$data = Purchases::with('customer', 'cashier') ->where('balance', '>', 0) ->withoutGlobalScopes() // 临时移除所有全局作用域 ->orderBy('created_at', 'DESC') ->get();
- 为排序字段增加表名前缀
如果后续查询中涉及关联表的created_at同名字段,会导致排序字段歧义,指定主表前缀即可解决:
$data = Purchases::with('customer', 'cashier') ->where('balance', '>', 0) ->orderBy('purchases.created_at', 'DESC') ->get();
- 关联模型排序需求调整
如果你是需要对预加载的customer、cashier关联数据排序,当前写法仅对主表purchases生效,需要调整with参数给关联查询单独加排序:
$data = Purchases::with([ 'customer' => fn($q) => $q->orderBy('created_at', 'desc'), 'cashier' => fn($q) => $q->orderBy('created_at', 'desc') ]) ->where('balance', '>', 0) ->orderBy('purchases.created_at', 'DESC') ->get();
- 排查后续逻辑覆盖
检查get()获取结果后,业务代码中是否有对集合重新排序、分组的操作,会覆盖原查询的排序结果。
内容的提问来源于stack exchange,提问作者Jumar Juaton
相关产品推荐
相关产品推荐

