您现在的位置是:自如初>LaravelLaravel

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

小白 2021-01-10 21:25:11 Laravel 164人已围观

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

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日

很赞哦!(1)

文章评论

登录 注册

自如初--时间轴

站名:自如初

独白:向前走!向前走!

邮箱:457969743@qq.com

站点信息