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
相关产品推荐
相关产品推荐

