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

如何通过单条语句获取Laravel多层嵌套hasMany关联模型并合并为数组

解决方案

可以直接通过 Laravel 集合的链式操作实现单语句获取所有关联D实例,和你原有四层遍历的逻辑、性能完全一致,且不会产生额外SQL查询:

方案1:flatMap链式调用(可读性更高)

$answer = A::with('B.C.D')->get()
    ->flatMap(fn($a) => $a->B)
    ->flatMap(fn($b) => $b->C)
    ->flatMap(fn($c) => $c->D)
    ->all();

如果你的PHP版本低于7.4不支持箭头函数,可以替换为匿名函数写法:

$answer = A::with('B.C.D')->get()
    ->flatMap(function ($a) { return $a->B; })
    ->flatMap(function ($b) { return $b->C; })
    ->flatMap(function ($c) { return $c->D; })
    ->all();

调用all()会返回数组格式的结果,如果需要保留Collection实例,去掉末尾的all()即可。

方案2:pluck通配符提取(写法更简洁)

$answer = A::with('B.C.D')->get()->pluck('B.*.C.*.D.*')->flatten()->all();

长期使用优化方案

如果你经常需要从A直接获取关联的D,可以在A模型中定义深层关联,后续调用会更便捷:你可以使用第三方深度关联扩展包定义hasManyDeep关联,定义完成后直接调用A::with('D')->get()->pluck('D')->flatten()->all()即可,不需要每次写多层集合操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:24:06