如何制作菜单和子菜单动态Laravel

时间:2015-08-19 12:36:11

标签: php mysql laravel laravel-5

我想制作菜单和子菜单动态。我用链接制作菜单但无法制作子菜单,请帮我修改数据库结构

表名:menu

id              menu_name       url                timestamps

表:sub_menu

id      submenu_name       link      menu_id  timestamps

我的查询就像这样

public function menu()
{   
   $sql=\DB::table('menu')->rightjoin('sub_menu','menu.id','=','sub_menu.menu_id')
   ->select('submenu_name','link','url','menu_id','menu_name','menu.id')->get();
    return view('products.show.menu',compact('sql'));
}

视图

<ul>    
    @foreach($sql as $key => $nav)
      @if($key > 0)
        <li>
            <a href="#">{{$nav->menu_name}}</a>
             @if (count($nav->submenu_name) > 0 )
                <ul>        
                 @foreach($nav->submenu_name as $child)
                    <li><a href="#">{{$child->submenu_name}}</a></li>
                @endforeach
                @endif
                </ul>
        </li>
      @endif
    @endforeach
    </ul>

2 个答案:

答案 0 :(得分:1)

您是否为这些表设置了模型?对于每个菜单/子菜单组合,您的查询将返回多行,这意味着您无法像现在一样迭代它。这里不需要使用查询构建器。

假设您的模型设置如下(您需要检查关系中使用的命名空间):

class Menu extends Eloquent
{
    protected $table = 'menu';

    public function submenu()
    {
        return $this->hasMany('App\SubMenu');
    }
}

class SubMenu extends Eloquent
{
    protected $table = 'sub_menu';

    public function menu()
    {
        return $this->belongsTo('App\Menu');
    }
}

在您的控制器中,您可以执行以下操作:

public function menu()
{
    $menu = Menu::with('submenu')->get();

    return view('products.show.menu', compact('menu'));
}

然后在你看来:

<ul>
    @foreach($menu as $menuItem)
        <li>
            {{ $menuItem->menu_name }}
            @if( ! $menuItem->submenu->isEmpty())
                <ul>
                    @foreach($menuItem->submenu as $subMenuItem)
                        <li>{{ $subMenuItem->submenu_name }}</li>
                    @endforeach
                </ul>
            @endif
        </li>
    @endforeach
</ul>

答案 1 :(得分:0)

您可以在没有控制器的情况下使用它

function testreply() {
 var threads = GmailApp.getInboxThreads();  
  Logger.log(threads[0].getFirstMessageSubject());
  threads[0].reply("test reply");
}