'bigint',// 'menu_name' =>'varchar',//菜单名称 'menu_code' =>'varchar',//菜单code 'menu_img' =>'varchar',//菜单图片 'menu_route' =>'varchar',//菜单路由 'menu_url' =>'varchar',//菜单地址 'menu_api' =>'varchar',//接口地址 'pid' =>'bigint',//父级id 'is_show' =>'int',//是否禁用 'is_private' =>'int',//是否私有 'level' =>'tinyint',//菜单等级,0公共,1超管,2业务公司,3供应商 'is_display' =>'int',//是否展示 'weight' =>'double',//权重 'status' =>'int',//状态 'is_del' =>'int',//是否删除 'addtime' =>'datetime',// 'updatetime' =>'datetime',// 'menu_type' =>'tinyint',//1菜单2 页面 ]; protected $createTime = 'addtime'; protected $updateTime = 'updatetime'; //获取菜单信息 public static function GetMenu($menuid){ $info=self::where(["id"=>$menuid,"is_del"=>0])->findOrEmpty(); if($info->pid>0){ $paren = self::where(['id'=>$info->pid,'is_del'=>0])->findOrEmpty(); } return ["menu_name"=>$info->menu_name,"parent_name"=>$paren->menu_name??"","parent_id"=>$info->pid]; } public function ActionInfo(){ return $this->hasMany(Action::class,"action_id")->where(["is_del"=>0]); } //由二级菜单获取父级集合 public static function GetMenuBySecod($menuid,$result=[]){ $menuArr = self::where(['id'=>$menuid])->findOrEmpty(); if(!$menuArr->isEmpty()){ if($menuArr->pid>0) self::GetMenuBySecod($menuArr->pid,$result); $result[] = ['id' => $menuid, 'rename' => $menuArr->menu_name, 'pid' => $menuArr->pid]; } return $result; } //通过功能集合返回菜单树状集 public function GetMenuByActionArr($actionArr,$where=[]){ $menuArr = Action::with(["ActionInfo"])->whereIn("id",$actionArr)->select(); $tree=[]; if(!$menuArr->isEmpty()){ $menuid = []; foreach ($menuArr as $item){ $menuid[$item->menuid][] =$item->action_code; } $menuArrId = array_unique(array_column($menuArr->toArray(),"menuid")); $menuAll=$this->where($where)->column("menu_name,menu_img,menu_route,is_display,status,pid,weight,level","id"); foreach ($menuArrId as $item){ $this->buildForwardTree($item,$menuid[$item]??[],$menuAll,$tree); } $weight= array_column($tree,'weight'); array_multisort($weight, SORT_DESC, $tree); } return $tree; } //有子找父级 public function buildForwardTree($itemId, $child = [],&$items, &$menuTree=[]) { if(!isset($items[$itemId]))return; $node=$items[$itemId]; if($node['pid']==0){ if(!isset($menuTree[$itemId])){ $menuTree[$itemId]=$node; } $menuTree[$itemId]['child'][]=$child; $weight= array_column($menuTree[$itemId]['child'],"weight"); array_multisort($weight, SORT_DESC, $menuTree[$itemId]['child']); }else{ $node['action']=$child; $this->buildForwardTree($node['pid'],$node,$items,$menuTree); } } public function GetMenuActionTree($pid=0,$level=[]){ $where=['pid'=>$pid,'is_del'=>0,'status'=>1]; if($level!='' && $pid>0) $where['level']=$level; $result = $this->field('menu_name,menu_img,menu_route,is_display,status,pid,weight,id,level') ->where($where) ->order(['weight'=>'desc','id'=>'desc'])->select(); $remp=[]; if($result->isEmpty())return $remp; foreach ($result as $item){ $item->child = $this->GetMenuActionTree($item->id,$level); if($item->pid>0){ $item->action = Action::with(["ActionInfo"])->field("id,action_code")->where (['menuid'=>$item->id,'is_del'=>0])->select(); } $remp[] = $item; } return $remp; } }