前言:
每次做权限管理都在郁闷别人后台的相关配置,每一个后台总是有差异需求,但是万变不离其宗,我们还是逃脱不了 常识性的无线分类递归 与 菜单树的限制 ,这里 为自己,他人总结出来了laravel 中自己个人常用的两种方法,用的时候直接拷贝就行了。
如果你有疑问 联系我qq无疑是最好的选择2097724800 上班专业q,这里 只粗暴的显示代码和用法 并没有给出你想看到的效果图,有句话是【绝知此事要躬行】。
如果你有更好的方法,一定要联系我分享哦,如果你用我的 那希望你支持我哦,点点赞
前提:
使用常见的数据库设计结构 id,name,pid,[status],[type],[route],[desc],[created_at],[updated_at],[deleted_at],
先说一种方法吧 使用with渴求式 查询加载
直接贴代码 粗暴
使用方式:
public static function GetAllMenuTree($pid=0 , &$arr)
{
$arr = self::query()
->select('id','name','pid','type','route')
->where('pid',$pid)
->where('status','Y')
->with(['menus'])
->get()->toArray();
}
加工方式:
public function menus()
{
return $this->hasMany(self::class,'pid','id')
->select('id','name','pid','type','route')
->whereStatus('Y')
->with(['menus']);
}
一、将要用到的数据查询出来 list成列表 无需处理
这个无须多言 贴段代码案例
public static function GetAdminMenuTree($m_id)
{
$list = self::query() //DB::table('admin_manage_node')
->leftJoin('admin_node','admin_manage_node.n_id','admin_node.id')
->select('admin_node.id','admin_node.name','admin_node.route','admin_node.pid')
->where(['admin_manage_node.m_id'=>$m_id,'admin_node.type'=>'menu'])
->get()
->toArray();
$tree = [];
self::ListToTree($list,'id','pid','children',0,$tree);
return $tree;
}
二、使用我已经封装过的树状图处理函数
public static function ListToTree($list, $primaryKey='id', $parentKey = 'pid', $childStr = 'children', $root = 0 ,array &$tree)
{
if (is_array($list)) {
//创建基于主键的数组引用
$refer = array();
foreach ($list as $key => $data) {
$refer[$data[$primaryKey]] = &$list[$key];
}
foreach ($list as $key => $data) {
//判断是否存在parent
$parantId = $data[$parentKey];
if ($root == $parantId) {
$tree[] = &$list[$key];
} else {
if (isset($refer[$parantId])) {
$parent = &$refer[$parantId];
$parent[$childStr][] = &$list[$key];
}
}
}
}
return $tree;
}
就是这么简单