You need to enable JavaScript to run this app. Laravel中如何获取父分类及其子分类下的服务并合并为单个数组
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:21:03