Laravel问题:如何按关联模型属性对父模型列表排序
问题修复指南
首先修正模型关联中的错误:
你的Revise模型里的belongsTo关联外键写错了,应该指向order_id而不是id,正确代码如下:
class Revise extends Model { public function order() { return $this->belongsTo(Order::class, 'order_id'); } }
然后解决排序无效的问题:with('revise')是预加载关联,它会先查询所有订单,再批量查询对应的修订记录,两个查询是分开执行的,所以直接用orderBy('revise.date')对主查询(orders表)无效——主查询里根本没有revise.date这个字段。
提供两种可行的解决方法:
方法一:关联表Join排序
通过join直接关联两张表,基于修订日期排序:
// 若要包含无修订记录的订单,改用leftJoin Order::leftJoin('revises', 'orders.id', '=', 'revises.order_id') ->select('orders.*') // 仅选择订单表字段,避免字段冲突 // 用COALESCE处理无修订记录的订单,可自定义这类订单的排序位置 ->orderByRaw('COALESCE(revises.date, "1970-01-01") asc') ->paginate(15);
如果能确保每个订单都有且只有一条修订记录,也可以用join替代leftJoin。
方法二:子查询获取修订日期排序
通过子查询为每个订单附加修订日期字段,再基于该字段排序:
Order::with('revise') ->select('orders.*') // 子查询获取对应订单的修订日期 ->selectSub(function ($query) { $query->select('date') ->from('revises') ->whereColumn('order_id', 'orders.id') ->limit(1); }, 'revise_date') ->orderBy('revise_date', 'asc') ->paginate(15);
内容的提问来源于stack exchange,提问作者saham nadeem
相关产品推荐
相关产品推荐

