Laravel无限级分类与传统递归无限级分类的实现

作者: 温新

分类: 【Laravel】

阅读: 3566

时间: 2021-01-10 13:25:11

Laravel结合模型实现无限级分类

假设有Category模型文件,位于app\Models\Category.php,有了模型文件,下面开始结合模型实现无限极分类。

第一步:模型文件中编写代码

// app/Models/Category.php

/**
* 使用关联模型获取顶级分类
*/
public function cates() {
    return $this->hasMany(get_class($this), 'pid' ,'id');
}

/**
 * 获取所有子集分类
 */
public function childCates() {
    return $this->cates()->with( 'childCates' );
}

第二步:控制器中调用

// CategroyController.php
public function index()
{
    $cates = Menu::with('childCates')->where('pid',0)->get();
    dd($cates);
}

没错,就这样完成了。

特别注意:模型cates方法中使用了get_class($this)方法,在此例中获取当前模型文件,即App\Models\Category",因此,该方法也可以改为如下方法更容易理解。

public function cates() {
    return $this->hasMany(Category::class, 'pid' ,'id');
}

为什么要使用hasMany方法?

hasMany是模型中一对多的关系,在分类中可以理解了,一个分类可以对应多个子分类,这就形成了一对的关系。如一个顶级分类可能对应多个子分类。

Laravel中使用递归实现无限级分类

作为演示,我这里还是放在Category.php模型文件中

/**
* 递归生成无限极分类树
*
* @param array $data   待分类的数组
* @param int $pid      父级ID
* @param int $level    缩进
*/
public function makeCategoryTree( $data, $pid = 0, $level = 0)
{
    static  $arr = [];
    foreach ($data as $k => $v) {
        if ($v->pid == $pid) {
            if($v->pid != 0){
                $v->name = '|' . str_repeat('--', $level) . $v->name;
            }
            $v->level = $level;
            $arr[] = $v;
            $this->makeCategoryTree($data,$v->id,$level+2);
        }
    }
    return $arr;
}

对于这两种方法而言,Laravel中的实现更为轻松容易,但是隐藏了更多的细节,当时间久了再来看时,或许一时间不容易认出这就是无限极分类吗?

对于使用而言,结合实际情况来使用。

2021-01-10

请登录后再评论