1

我正在使用 Laravel 数据查询,我需要一个查询,当我获取类别时,它将对父级的所有子级进行分组。

类别表有一个名称和一个 parent_id,类别的路由将 parent_id 设置为 null,查询应该返回按父 id 分组的每个类别,并且父节点应该是每个组的第一个节点。

4

2 回答 2

3

如果您只想在某处将类别显示为父子项,则不需要像那样收集它们,您可以在模型中建立关系,例如

class Category {
    public function children()
    {
        return $this->hasMany(self::class, 'parent_id');
    }

    public function parent()
    {
        return $this->hasMany(self::class, 'id', 'parent_id');
    }
}

根据您的要求,可能是一对多的关系而不是多对多的关系。

现在你可以让所有的父母都喜欢

Category::whereNull('parent_id')->get();

或使用范围

Category::parent()->get();并在模型中定义范围

并遍历父类别,例如

@foreach ( $categories as $category ) 
       {{ $category->name }}
       @foreach ( $category->children as $subCategory )
           {{ $subCategory->name }}
       @endforeach
@endofreach

并检索带孩子的父母,您可以使用

Category::whereNull('parent_id')->with('children')->get();

或者

Category::parent()->with('children')->get();

我没有测试过代码,但大致会是这样。

于 2019-04-16T12:33:43.363 回答
-2

当您从查询中获取返回的集合时,您可以使用->groupBy()方法,您可以在其中指定结果应该分组的字段。

假设您的类别模型是Category

$categories = Category::all()->groupBy('parent_id')->toArray();
于 2019-04-16T09:57:29.743 回答