【问题标题】:How to create a database-driven multi-level navigation menu using Laravel如何使用 Laravel 创建数据库驱动的多级导航菜单
【发布时间】:2014-02-13 19:41:14
【问题描述】:

我是 Laravel 4 的新手,我对它的模型完全感到困惑。 我正在尝试为我的项目创建一个数据库驱动的导航菜单,我所知道的是我必须创建一个模型来与数据库交互(基于我从 codeigniter 获得的知识)。一直在学习,厌倦了无法前进,这是我到目前为止想出的代码:

/app/models/navigation.php

<?php

class Navigation extends Eloquent {

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'navigation';

    /**
     * Get the unique identifier for the menu item.
     *
     * @return mixed
     */
    public function getItemIdentifier()
    {
        return $this->getKey();
    }

}

这是我将用于此模型的导航数据库表:

【问题讨论】:

  • 你还做了什么?这只是一个模型,它可以很好地查询并将记录添加到您的表中,但您的菜单不能仅使用此代码。
  • 我是否应该继续创建一个名为“mainMenu”的函数并查询我的数据库,检索结果,将它们放入多维数组中?或者在 Laravel 中有更简单的方法吗?
  • 您不必为此使用模型。这是建议,而不是规则。您可以使用 Fluent(查询生成器)并让它返回一个数组或使用原始 SQL 查询。此外,您可以在 Fluent / Eloquent 中使用原始语句。
  • 但是我想在我的项目中使用 MVC 标准,以防其他开发人员在不久的将来加入我的项目。
  • 既然如此,那就继续做吧。

标签: php mysql laravel laravel-4


【解决方案1】:

因此,在从不同来源进行更多搜索和阅读之后,这就是我想出的,并且运行良好:

/app/models/Navigation.php

<?php

class Navigation extends Eloquent {

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'navigation';

    public function parent() {

        return $this->hasOne('navigation', 'id', 'parent_id');

    }

    public function children() {

        return $this->hasMany('navigation', 'parent_id', 'id');

    }  

    public static function tree() {

        return static::with(implode('.', array_fill(0, 4, 'children')))->where('parent_id', '=', NULL)->get();

    }

}

/app/controllers/HomeController.php

<?php

class HomeController extends BaseController {

    protected $layout = "layouts.main";

    public function showWelcome()
    {

        $items = Navigation::tree();

        $this->layout->content = View::make('layouts.home.index')->withItems($items);

    }

}

/app/views/layouts/home/index.blade.php

<ul>
    @foreach($items as $item)
        <li>{{ $item->title }}
            @foreach($item['children'] as $child)
            <li>{{ $child->title }}</li>
            @endforeach
        </li>
    @endforeach
</ul>

【讨论】:

  • 这为我节省了数小时的构建、测试、删除和重写代码的时间。谢谢:)
  • 不,你可以继续无限关卡
  • 我是 Laravel 的新手,我正在构建和你一样的结构,只是增加了几个类来控制用户权限(用户有很多权限,其中有许多Routes,与MenuOptions相关)。我觉得奇怪的是 Laravel 文档说 hasOne 关系的倒数是 BelongsTo。在这种情况下,belongsTo 不起作用。您必须使用 hasMany 来查找菜单选项的子项。很高兴找到有人证实这一点。 ;)
  • 完美,我刚刚将它与我现有的代码结合起来并完美运行。谢谢哥们。我正在寻找这种解决方案。
  • 太棒了,这是基于菜单的雄辩。 array_fill() 作为嵌套级别。出于性能原因,我建议将嵌套级别设置为 3 而不是 100。public static function tree($level = 3) { return static::with(implode('.', array_fill(0, $level, 'children')))-&gt;where('parent_id', '=', NULL)-&gt;get(); }
【解决方案2】:

Laravel 不会为你创建菜单,但它会帮助你编写干净的代码来完成它。

使用您的模型查询您的表格并创建菜单项:

<?php

class HomeController extends Controller {

    public function index()
    {
        $items = Navigation::all();

        return View::make('index')->withItems($items);
    }

}

在你看来,你将能够

<ul>
    @foreach($items as $item)
        <li>{{ $item->title }}</li>  
    @endforeach
</ul>

PHP、Composer 甚至 Laravel 给你的另一种可能性是安装一个特定的包来帮助你做事,这个是为了简化菜单生成:https://github.com/anhsaker/laravel-menu

编辑

看起来您需要无限的多级菜单并且您不想使用包,对吧?

不要忘记 Laravel 和 Laravel Blade 都是 PHP,所以你可以在 PHP 中创建类来帮助你在 Laravel 中构建东西,比如:

class Menu {

   public function build($collection)
   {
      // build your <li> $items

      return $items;   
   }

}

那么你的控制器应该是这样的:

<?php

class HomeController extends Controller {

    public function index()
    {
        $items = with(new Menu)->build(Navigation::all());

        return View::make('index')->withItems($items);
    }

}

而在刀片中你只需要

<ul>
    {{ $items }}
</ul>

你要明白,那些你不能开箱即用的东西,因为它们超出了框架的范围,你可以通过使用PHP完美得到,

这里有一些用于构建多级菜单的 PHP 逻辑,但是,当然,您必须适应您的需求:http://forrst.com/posts/Flat_Array_Multi_HTML_UL-IKp

【讨论】:

  • 这是一个很好的开始,现在我得到了所有的标题作为输出,现在我该如何安排我的主要类别和子类别(子菜单,那些有 parent_id 的)里面输出,也许是多维数组或比 laravel 开箱即用支持的更好的东西?
  • 关于使用包,现在我正在尝试用 Laravel 理解和编写自己的代码,并在使用包之前走出黑暗。
  • 编辑回答更多。
【解决方案3】:

对于像我这样在将近 4 年后访问这篇文章的人,我想说新的最佳解决方案都在这个视频中:

https://laracasts.com/series/laravel-5-fundamentals/episodes/25

查看作曲家

https://laravel.com/docs/5.4/views#view-composers

View Composer 是回调或类方法,当 视图被渲染。如果您有想要绑定到视图的数据 每次呈现该视图时,视图编辑器都可以帮助您组织 将该逻辑放到一个位置。

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多