laravel 无限极菜单分类

635次阅读
没有评论

共计 1244 个字符,预计需要花费 4 分钟才能阅读完成。

在 Laravel 中实现菜单的无限极分类可以使用递归的方式来实现。以下是一个基本的无限极分类的示例:

1、首先在数据库中创建一个菜单表,包含以下字段:
id:菜单的唯一标识符
parent_id:当前菜单的父级菜单的 id,如果没有父级菜单,则为 NULL
name:菜单的名称
url:菜单的链接地址
order:菜单的排序
2、在菜单模型中创建一个递归方法,该方法将返回一个多维数组,其中包含所有菜单的子菜单以及它们的子菜单。

class Menu extends Model
{public function children()
{return $this->hasMany(Menu::class, 'parent_id', 'id');
}
public function recursiveChildren()
{$children = $this->children;

    if ($children->isEmpty()) {return null;}

    foreach ($children as $child) {$child->children = $child->recursiveChildren();}

    return $children;
}

}
在上面的代码中,children 方法将返回当前菜单的所有子菜单。在 recursiveChildren 方法中,使用递归的方式获取当前菜单的所有子菜单以及它们的子菜单,并将其存储在一个名为 children 的属性中。

3、在控制器中查询所有的顶级菜单,并使用 recursiveChildren 方法获取它们的所有子菜单。

class MenuController extends Controller
{public function index()
{$menus = Menu::whereNull('parent_id')->get();    
foreach ($menus as $menu) {$menu->children = $menu->recursiveChildren();}

    return view('menu.index', compact('menus'));
}
}

在上面的代码中,首先使用 whereNull 方法查询所有顶级菜单,然后使用 recursiveChildren 方法获取它们的所有子菜单,并将它们存储在 children 属性中。最后将数据传递到视图中进行渲染。

4、在视图中使用循环和递归方式渲染菜单。

<ul>
    
@foreach ($menus as $menu)
        
<li>
            
<a href="{{$menu->url }}">{{$menu->name }}
</a>
@if ($child->children)
    <ul>
        @foreach ($child->children as $child)
            @include('menu.child', ['child' => $child])
        @endforeach
    </ul>
@endif

在上面的代码中,使用循环和递归方式渲染菜单。如果当前菜单有子菜单,则使用递归方式渲染它们。在子菜单模板中,也使用递归方式渲染所有子菜单。

正文完
加入官方交流QQ群:778957856
post-qrcode
 0
clark
版权声明:本站原创文章,由 clark 于2023-03-29发表,共计1244字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)