首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建多级菜单php Laravel

问创建多级菜单php Laravel
EN

Stack Overflow用户
提问于 2020-09-08 10:53:54
回答 2查看 78关注 0票数 1

我正在用laravel做创建动态菜单的功能,我有如下的tbl_menu表:

代码语言:javascript
复制
menu_id   parent_id  menu_name      link       order   
  1           0       Level_1       url_1        1  
  2           0       Level_1       url_2        1
  3           2       Level_2       url_3        2
  4           2       Level_2       url_4        3 
  5           4       Level_3       url_5        3 

我希望结果是一个如下所示的数组:

代码语言:javascript
复制
-Level_1
        -Level_2
        -Level_2
-Level_1
       _Level_2
       _Level_2
               _Level_3

我的代码如下:

代码语言:javascript
复制
public function SelectAllChildeLv1ByParentId($id){
    $result = DB::table('tbl_menu')->where('parent_id', $id)
            ->orderBy('order', 'asc')->get();
    return $result;
}

public function SelectAllMenuParent(){
        $result = DB::table('tbl_menu')->where('parent_id', 0)
            ->orderBy('order', 'asc')->get();
        return $result;
    }
public function getMenuChildren($listParent, $step = 3)
    {
        $results = [];

        if ($step > 0) {
            $step--;
            if($listParent) {
                foreach($listParent as $index => $parent) {
                    $listChild = $this->SelectAllChildeLv1ByParentId($parent->menu_id);
                    $listChild1 = $this->getMenuChildren($listChild, $step);
                    $results[$index] = $parent;
                    $results[$index]->menu_child = $listChild1;
                }
            }
        }

        return $results;
    }

public function getAllMenus() {
        $allMenuParent = $this->SelectAllMenuParent();
        $results = $this->getMenuChildren($allMenuParent);
        return $results;
    }

结果是正确的,但是运行了太多的查询。我想优化它,但还没有弄清楚。谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-08 11:55:49

尝试:

代码语言:javascript
复制
public function get()
{
  $menu = DB::table('tbl_menu')
  ->orderBy('order', 'asc')->get();
  $parents = $menu->where('parent', 0);
  $items = self::tree($parents, $menu);
  return $items;
}

public function tree($items, $all_items)
{
  $data_arr = array();
  foreach ($items as $i => $item) {
    $data_arr[$i] = $item->toArray(); //all column attributes
    $find = $all_items->where('parent', $item->id);
    //$data_arr[$i]['tree'] = array(); empty array or remove if you dont need it
    if ($find->count()) {
      $data_arr[$i]['tree'] = self::tree($find, $all_items);
    }
  }

  return $data_arr;
}
票数 2
EN

Stack Overflow用户

发布于 2020-09-08 14:42:07

使用雄辩。

首先,将此代码添加到'tbl_menu‘模型中:

代码语言:javascript
复制
protected $with = ['children'];

public function children()
{
    return $this->hasMany(YOUR_CLASS_NAME::class, 'parent_id', 'id')->orderBy('order');
}

现在如果你调用主菜单,以及所有的子菜单。

等:YOUR_CLASS_NAME::where('parent_id', 0)->get()。

然后,您就可以在调用

代码语言:javascript
复制
public $menus = [];
public $level = 0;

public function getMenus($request){
    $menus = YOUR_CLASS_NAME::where('parent_id', 0)
        ->orderBy('order')
        ->get();

    $this->recursiveMenu($menus);

    return $this->menus;
}

public function recursiveMenu($menus, $lvl = 0){
    foreach ($menus as $key => $menu) {
        $this->menus[$menu->id] = str_repeat('—', $lvl).' '.$menu->title;

        if($menu->children){
            $this->level++;
            $this->recursiveMenu($menu->children, $this->level);
        }
        if (!isset($menu[$key+1])) {
            $this->level--;
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63786502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档