Как создать многоуровневое меню навигации с помощью базы данных с помощью Laravel

Я новичок в 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(); } } 

И это моя таблица базы данных навигации, которую я буду использовать для этой модели:

введите описание изображения здесь

Поэтому, после гораздо большего поиска и чтения из разных источников, это то, с чем я столкнулся, и он работает нормально:

/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 не будет создавать для вас меню, но это поможет вам написать чистый код, чтобы сделать это.

Используйте свою модель для запроса своей таблицы и создания пунктов меню:

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

Для таких, как я, посещение этой статьи почти 4 года спустя, я бы сказал, что новое лучшее решение – все в этом видео:

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

Просмотр композиторов

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

Просмотр композиторов – это обратные вызовы или методы класса, вызываемые при визуализации представления. Если у вас есть данные, которые вы хотите привязать к представлению каждый раз при визуализации представления, композитор представления может помочь вам организовать эту логику в одном месте.