如何通过单条语句获取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
相关产品推荐
相关产品推荐

