Laravel中如何通过HasManyThrough实现三层关联的嵌套数组返回?
解决方案
你用错关联关系了——HasManyThrough的设计目的就是跳过中间表直接获取顶层模型到底层模型的平级关联,所以它只会把Work直接挂在Quotation下,根本没法实现嵌套结构。要得到Quotation -> Service -> Work的嵌套数组,正确的做法是用嵌套预加载,步骤如下:
1. 修正模型关联
只需要在两个层级分别定义hasMany关联,不需要HasManyThrough:
Quotation 模型
class Quotation extends Model { public function service() { return $this->hasMany(Service::class, 'quotations_id'); } }
Service 模型
class Service extends Model { public function work() { return $this->hasMany(Work::class, 'service_id'); } }
2. 控制器使用嵌套预加载
直接通过with()的嵌套语法一次性加载所有关联,不需要分开get()和load():
$quotations = Quotation::with('service.work')->get();
这样返回的结构就是你要的嵌套形式:
[ { "id": 1, "name": "报价1", "service": [ { "id": 1, "quotations_id": 1, "name": "服务1", "work": [ { "id": 1, "service_id": 1, "name": "工单1" } ] } ] } ]
额外说明
如果非要保留HasManyThrough(比如某些场景需要直接从报价拿所有工单),也不影响嵌套预加载的使用——两种关联可以共存,但嵌套结构只能靠service.work的预加载实现,HasManyThrough做不到嵌套。
内容的提问来源于stack exchange,提问作者japiters
相关产品推荐
相关产品推荐

