Laravel菜单自我递归

Hel*_*llo 7 php laravel laravel-4

该模型

 class Menu extends Eloquent {

        public static $table = 'menus';

        public function parent_menu()
        {
            return $this->belongs_to('Menu', 'parent_id');
        }

    }
Run Code Online (Sandbox Code Playgroud)

我如何在控制器中得到它:

$menus = Menu::with('parent_menu')->get();
Run Code Online (Sandbox Code Playgroud)

如何在视图中渲染它:

foreach($menus as $m)
{
  echo $m->parent_menu->title;
}
Run Code Online (Sandbox Code Playgroud)

当关系在表中时,看起来有问题,我得到一个错误

`trying to get property of non object`
Run Code Online (Sandbox Code Playgroud)

这有解决方案吗?

Pev*_*ara 5

我在 Laravel 4 中实现了一种在菜单中获得无限深度的方法。这并不完全符合您的要求,但该技术应该很容易适应。

对于初学者来说,我的菜单只是一个数组(目前),它被分配给主视图,看起来像这样。

$menu = array(
   array(
     'name' => 'item1',
     'url' => '/'
   ),
    array(
     'name' => 'item2',
     'url' => '/',
     'items' => array(
        array(
          'name' => 'subitem1',
          'url' => '/'
        ),
        array(
          'name' => 'subitem2',
          'url' => '/'
        )
     )
   )
);
Run Code Online (Sandbox Code Playgroud)

您也可以使用模型轻松实现此结构。您将需要功能child_items或其他东西,因为我们将从上到下呈现菜单,而不是从下到上。

现在在我的主刀片模板中我这样做:

<ul>
    @foreach ($menu as $item)
       @include('layouts._menuItem', array('item' => $mainNavItem))
    @endforeach
</ul>
Run Code Online (Sandbox Code Playgroud)

然后在layouts._menuItem模板中我这样做:

<?php
$items = array_key_exists('items', $item) ? $item['items'] : false;
$name = array_key_exists('name', $item) ? $item['name'] : '';
$url = array_key_exists('url', $item) ? url($item['url']) : '#';
$active = array_key_exists('url', $item) ? Request::is($item['url'].'/*') : false;
?>

<li class="@if ($active) active @endif">
       <a href="{{ $url }}">{{ $name }}</a>
       @if ($items)
          <ul>
             @foreach ($items as $item)
               @include('layouts._menuItem', array('item' => $item))
             @endforeach
          </ul>
       @endif
</li>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该模板递归地调用自身,但使用不同的$item变量。这意味着可以在菜单结构中深入到您想要的程度。(php 块只是用来准备一些变量,这样我就可以保持实际的模板代码干净且可读,从技术上讲,这不是必需的)。

我在上面的代码片段中删除了 Twitter Bootstrap 代码,以保持简单(我的模板/数组中实际上有标题、下拉开关、图标、分隔线……),因此代码没有经过测试。不过,完整版本对我来说工作得很好,所以如果我在某个地方犯了错误,请告诉我。

希望这对您(或其他任何人,因为这是一个相当老的问题)有所帮助。如果您需要更多指示/帮助,或者想要我的完整代码,请告诉我。

快乐编码!


tuu*_*rbo 0

这可能会有一些帮助。这是我如何处理产品类别/子类别的

模型:

<?php

class Category extends Eloquent {

    protected $table = 'product_category';

    public function subcat()
    {
        return $this->hasMany('Category', 'node_id')->orderBy('position');
    }
Run Code Online (Sandbox Code Playgroud)

查询(使用预加载时可以使用条件)

$categories = Category::with(['subcat' => function($query){
    $query->with(['subcat' => function($query){
        $query->orderBy('name');
    }])
}])->where('node_id', 0)->orderBy('position')->get(['id', 'name']);

foreach ($categories as $level1)
{
    echo $level1->name;

    foreach ($level1->subcat as $level2)
    {
        echo $level2->name;

        foreach ($level2->subcat as $level3)
        {
                echo $level3->name;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)