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
请登录后再评论