Laravel中如何获取父分类及其子分类下的服务并合并为单个数组
解决方案
你可以直接通过 Laravel 集合的内置方法,把主分类服务、所有子分类的服务合并到同一个集合中,再转成数组返回即可。注意查询单条分类时用first()代替get(),避免返回多余的集合嵌套。
基础版(仅支持一层子分类)
适配你当前的代码结构,仅需要做小范围修改:
public function serviceswithChildrenCategory($id) { // 查询单个主分类,预加载自身服务、子分类及子分类服务 $category = Category::where('id',$id) ->with('services') ->with(['childrens' => function($query) { $query->with('services'); }]) ->first(); // 合并主分类服务 + 所有子分类的服务 $allServices = $category->services->merge( $category->childrens->pluck('services')->flatten() ); // 转成数组返回,也可直接返回集合对象按需处理 return $allServices->toArray(); }
增强版(支持无限层级子分类)
如果你的子分类还嵌套了多层下级分类,可以加一个递归方法提取所有层级的服务:
// 递归提取所有分类下的服务 protected function extractServices($categories) { $services = collect(); foreach ($categories as $category) { $services = $services->merge($category->services); if ($category->childrens->isNotEmpty()) { $services = $services->merge($this->extractServices($category->childrens)); } } return $services; } public function serviceswithChildrenCategory($id) { $category = Category::where('id',$id) ->with('services') ->with('childrens.services') // 嵌套预加载可以直接简写 ->first(); $allServices = $category->services->merge( $this->extractServices($category->childrens) ); return $allServices->toArray(); }
注意事项
- 如果需要对服务去重,可以在合并后追加
->unique('id')方法,按服务ID过滤重复值 - 若需要保留原分类结构返回,可以把合并后的服务数组挂载到
$category的属性中再返回
内容的提问来源于stack exchange,提问作者saroj baskota
相关产品推荐
相关产品推荐

