首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据分类id获取laravel中的所有子类别id?

如何根据分类id获取laravel中的所有子类别id?
EN

Stack Overflow用户
提问于 2021-04-14 07:56:06
回答 1查看 601关注 0票数 0

我试图将所有子类别ids从顶级类别递归地获得到其最底层的子类别。我已经为每个类别设置了一个父id,对于我使用的最上面的类别,我使用0作为父类别。我得到了子类的清单,但不是所有的。请帮帮忙。

控制器代码

代码语言:javascript
复制
public function index($slug){ 
    $category=Category::where('category_slug',$slug)->first();
    if(!empty($category)){
        $category_ids=$this->GetAllChildCategoryIDS($category->id);                
        dd($category_ids);
    }       
}

public function GetAllChildCategoryIDS($category_id) {
    $ids_array = Category::where('parent_id',$category_id)->pluck('id')->all();
    foreach($ids_array as $ida) {
        $temp_ids=$this->GetSubCategoryIDS($ida);
        if(count($temp_ids)) {
            $ids_array[]=$temp_ids;
        }
    }  
        
    if(!empty($ids_array)) {
        $ids_array=$this->array_flatten($ids_array);
    }    
    return $ids_array;
}

public function GetSubCategoryIDS($category_id) {
    $ids_array = Category::where('parent_id',$category_id)->pluck('id')->all();
    return $ids_array;
}

public function array_flatten($array) { 
    if (!is_array($array)) { 
        return FALSE; 
    } 
    $result = array(); 
    foreach ($array as $key => $value) { 
        if (is_array($value)) { 
            $result = array_merge($result, $this->array_flatten($value)); 
        } else { 
            $result[$key] = $value; 
        } 
    } 
    return $result; 
}

结果

代码语言:javascript
复制
array:20 [▼
  0 => 22
  1 => 23
  2 => 24
  3 => 25
  4 => 26
  5 => 27
  6 => 35
  7 => 36
  8 => 37
  9 => 38
  10 => 39
  11 => 40
  12 => 41
  13 => 28
  14 => 29
  15 => 30
  16 => 31
  17 => 32
  18 => 33
  19 => 34
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-14 09:38:03

您可以使用递归关系( so ):

代码语言:javascript
复制
public function childs(){
    return $this->hasMany(Category::class);
}

public function recursiveChilds(){
   return $this->childs()->with('recursiveChilds');
}

然后,您可以访问任何n级的childs:

代码语言:javascript
复制
foreach($category->recursiveChilds as $level_1_child){
     foreach($level_1_child->recursiveChilds as $level_2_child){
         [...]
     }
}

如果您想要一个所有儿童的集合,您可以使用以下命令:

代码语言:javascript
复制
public static function flattenChilds($parent)
    {
        $result = collect([]);
        foreach ($parent->recursiveChilds as $child) {
            $result->push($child);
            $result = $result->merge(static::flattenChilds($child));
        }

        return $result->filter();
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67087671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档