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

Laravel模型中如何实现嵌套查询获取卡车历史记录关联的发票信息

问题解答

完全可以在模型层实现该需求,仅需2步操作即可:

步骤1:为InvoiceDetail模型添加发票关联

首先在InvoiceDetail模型文件中定义和发票表的关联关系:

// app/Models/InvoiceDetail.php
public function invoice()
{
    // 第二个参数为InvoiceDetail表关联发票表的外键名,第三个为INVOICE表的主键名,可根据实际字段调整
    return $this->belongsTo(Invoice::class, 'invoice_id', 'id');
}

步骤2:嵌套预加载发票关联

根据业务场景二选一即可:

  • 方式一:仅当前查询接口加载(不影响其他使用truckHistory关联的接口)
    修改TruckController中的预加载参数,用.符号实现嵌套关联加载:

    public function getTruck($id)
    {
        $truck = Truck::with(['truckHistory.invoice'])->find($id);
        return $truck;
    }
    

    调整后返回结果中,每一条truckHistory条目下都会自动携带对应的invoice发票数据。

  • 方式二:全局默认加载(适合所有用到truckHistory的场景都需要发票信息的情况)
    修改Truck模型的truckHistory关联,追加with方法默认嵌套加载:

    public function truckHistory(){
        return $this->hasMany(InvoiceDetail::class,'plate_no','plate')->with('invoice');
    }
    

    该方式无需修改原有Controller代码,即可自动返回关联的发票数据。

额外优化建议

你当前写的getCompanyNameAttribute访问器存在N+1性能问题,每次调用都会单独触发SQL查询,建议调整为:

// 修改访问器逻辑,直接读取预加载的关联属性
public function getCompanyNameAttribute()
{
   return $this->companys?->name ?? '';
}
// 预加载时同步加载companys关联
$truck = Truck::with(['companys', 'truckHistory.invoice'])->find($id);

内容的提问来源于stack exchange,提问作者lidersin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:45:05