在Laravel 5.2中创建嵌套类别列表的痕迹

时间:2016-09-09 06:01:21

标签: php mysql laravel

+---------+-----------+-----------+
|      id |   name    | parent_id |
+---------+-----------+-----------+
|       1 | Supports  |        0  |    
|       2 | Mobile    |        0  |      
|       3 | Outdoor   |        1  |       
|       4 | Samsung   |        2  |   
|       5 | Cricket   |        3  |  
|       6 | Team A    |        5  |      
+---------+-----------+-----------+

分类模型

class Categories extends Model {

    public $table = "categories";
    protected $fillable = ['name', 'parent_id', 'status'];

    public function parentCat() {
        return $this->belongsTo(Categories::class, 'parent_id');
    }

    public function childrenCat() {
        return $this->hasMany(Categories::class, 'parent_id');
    }

} 

控制器方法

Categories::where('parent_id', $parent_id)->orderBy('name', 'ASC')->get();

问题

我想显示带有类别和子类别的面包屑,如果我正在查看板球子类别,例如:

主页 - >支持 - >户外 - >蟋蟀

问题二

删除主要分类时如何删除所有子类别。例如,如果我删除户外,那么Cricket和A队应该删除

1 个答案:

答案 0 :(得分:1)

首先考虑将您的类别结构更改为Nested Set model。处理嵌套类别(以及其他结构)更好更有效。这是Laravel的好包装:

https://github.com/etrepat/baum

对于您的示例,只有不是特别优化的解决方案。当您查询叶子类别时:

$category = Categories::where('parent_id', $parent_id)
               ->orderBy('name', 'ASC')
               ->first();
return view({your view here}, compact('category'));

您需要部分视图(例如:breadcrumb.blade.php),其中包含以下部分:

<ul>
@section('breadcrumb')
@show
</ul>

在主要行动中,你可以做一些这样的想法:

@section('breadcrumb')
    <li>{{$category->name}}</li>
@stop
@while($parent = $category->parent)
    @section('breadcrumb')
        @parent
        <li>{{$parent->name}}</li>
    @stop
@endwhile

<强>注意

但正如我在开头说的那样 - 这是非常次优的解决方案,因为你必须为每个父级调用查询,所以只有你没有多少嵌套级别才能正常。