php - Laravel Menu 自递归

标签 php laravel laravel-4

模型

 class Menu extends Eloquent {

        public static $table = 'menus';

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

    }

我如何在 Controller 中获取它:

$menus = Menu::with('parent_menu')->get();

如何在 View 中呈现它:

foreach($menus as $m)
{
  echo $m->parent_menu->title;
}

当关系在表内时看起来有问题,我收到错误

`trying to get property of non object`

有解决办法吗?

最佳答案

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

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

$menu = array(
   array(
     'name' => 'item1',
     'url' => '/'
   ),
    array(
     'name' => 'item2',
     'url' => '/',
     'items' => array(
        array(
          'name' => 'subitem1',
          'url' => '/'
        ),
        array(
          'name' => 'subitem2',
          'url' => '/'
        )
     )
   )
);

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

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

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

然后在 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>

如您所见,此模板递归调用自身,但使用不同的 $item 变量。这意味着可以在菜单结构中达到您想要的深度。 (php block 只是用来准备一些变量,这样我就可以保持实际模板代码的清洁和可读性,从技术上讲,这不是必需的)。

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

希望这对您(或其他任何人,因为这是一个相当古老的问题)有所帮助。让我知道您是否需要更多的指导/帮助,或者您是否需要我的完整代码。

编码愉快!

关于php - Laravel Menu 自递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379416/

相关文章:

php - Laravel Hash::check() 总是返回 false

php - 拉维尔 : how to add where clause using query builder?

php - 重复值 条件选择 PHP/mySQL

php - 查找 ABC 和 ACA 的字母序列值

php - 访问SimpleXMLElement对象值

Laravel 将 url 参数从 Controller 传递到路由

mysql - 如何在 Laravel 中编写原始查询

laravel - 或者给出意想不到的结果

php - 如何根据另一个表中的 id 字段从一个表中获取数据?

php - PDO while 循环重用输出模板