Ranjeet Karki
Ranjeet Karki

Reputation: 2647

How to make menu and submenu dynamic Laravel

I want to make menu and submenu dynamic .I made menu with their link but unable to make submenu,please help me my database structure

table name:menu

id              menu_name       url                timestamps

table:sub_menu

id      submenu_name       link      menu_id  timestamps

my query is like this

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'));
}

view

<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>

Upvotes: 0

Views: 12953

Answers (2)

Mahmoud Khalil
Mahmoud Khalil

Reputation: 344

You can use it without controller

`@foreach(App\Menu::get() as $menuItem)
  @if( ! $menuItem->submenu->isEmpty() )
    <li class="dropdown">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
        {{ $menuItem->menu_name }}
    </a>
  @else
    <li>
    <a href="{{ $menuItem->url }}">{{ $menuItem->menu_name }}</a>
  @endif

  @if( ! $menuItem->submenu->isEmpty())
      <ul class="dropdown-menu" role="menu">
          @foreach($menuItem->submenu as $subMenuItem)
              <li><a href="{{ $subMenuItem->link }}">{{ $subMenuItem->submenu_name }}</a></li>
          @endforeach
      </ul>
  @endif
  </li>
@endforeach`

Upvotes: 0

benJ
benJ

Reputation: 2580

Have you set up models for these tables? Your query will return multiple rows for each menu/submenu combination, meaning you can't just iterate over it as you are. There's no need to use the query builder here.

Assuming your models are set up as follows (you will need to check the namespace used in the relationships):

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');
    }
}

In your controller, you can do:

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

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

Then in your view:

<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>

Upvotes: 2

Related Questions