You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:23:18