Создайте вложенные списки категорий в Laravel 5

Я довольно новичок в Laravel и пытаюсь создать древовидную структуру категорий для своего приложения. Это код, которым я пользовался до сих пор, но все еще не могу добиться того, чего хочу. Мой контроллер:

public function index() { $categories = Category::with('children')->get(); return view('backend.categories.index')->with('categories', $categories); } 

Модель моей категории:

 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Category extends Model { protected $guarded = ['id']; public function parent() { return $this->belongsTo('App\Category', 'parent_id'); } public function children() { return $this->hasMany('App\Category', 'parent_id'); } } 

Мой взгляд:

 <table class="table table-bordered table-hover"> <thead> <tr> <th>Name</th> <th>Description</th> <th>Slug</th> <th>Action</th> </tr> </thead> <tbody> @foreach ($categories as $category) {{--@foreach ($category->children as $children)--}} <tr> <td>{{ $category->name }}</td> <td>{{ $category->description }}</td> <td>{{ $category->slug }}</td> <td><a class="edit" href="{!! action('Admin\CategoriesController@edit', $category->id) !!}" title="Edit"><i class="fa fa-pencil-square-o"></a></i> <a class="delete" href="{!! action('Admin\CategoriesController@destroy', $category->id) !!}" title="Are you sure you want to delete?"><i class="fa fa-trash-o"></i></a></td> @foreach ($category->children as $children) <tr> <td>{{ $children->name }}</td> <td>{{ $children->description }}</td> <td>{{ $children->slug }}</td> <td></td> </tr> @endforeach </tr> </tbody> {{--@endforeach--}} @endforeach </table> 

Я пытаюсь создать структуру, как показано ниже:

  • Модные аксессуары
    • мешки
    • Полотна
  • Мобильные телефоны
    • таблетки
    • Смартфоны

EDIT. Моя структура базы данных:

 +-------------+------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------+------+-----+---------------------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | slug | varchar(255) | NO | | NULL | | | parent_id | int(11) | YES | | NULL | | | description | text | NO | | NULL | | | created_at | timestamp | NO | | 0000-00-00 00:00:00 | | | updated_at | timestamp | NO | | 0000-00-00 00:00:00 | | +-------------+------------------+------+-----+---------------------+----------------+ 

Related of "Создайте вложенные списки категорий в Laravel 5"

В настоящее время вы загружаете все категории (включая дочерние), а затем просматриваете их. Вы хотите только загрузить корневые категории (категории без родителя). Чтобы сделать это, измените свой метод контроллера только на загрузку категорий, где parent_id имеет значение null .

 $categories = Category::whereNull('parent_id')->with('children')->get(); 

Вероятно, в модели вам нужно изменить inorder для обозначения модели для детей:

 public function children() { return $this->hasMany('App\Children', 'parent_id'); } 

Модель для категории:

 class Category extends Model { protected $guarded = ['id']; protected $fillable = array('name','description','slug','created_at','updated_at'); public function children() { return $this->hasMany('App\Children', 'parent_id'); } } 

Модель для детей:

 class Children extends Model { protected $table = 'children'; protected $fillable = array('name','description','parent_id','created_at','updated_at'); } 

В контроллере получить категории с детьми, как это:

 $categories = Category::with(['children'])->get(); 

и исправить теги – <i class="fa fa-pencil-square-o"></i></a>

то в представлении:

 @foreach ($categories as $category) <ul> <li>{{ $category->name }}</li> <li>{{ $category->description }}</li> <li>{{ $category->slug }}</li> <li><a class="edit" href="{!! action('Admin\CategoriesController@edit', $category->id) !!}" title="Edit"><i class="fa fa-pencil-square-o"></i></a> <a class="delete" href="{!! action('Admin\CategoriesController@destroy', $category->id) !!}" title="Are you sure you want to delete?"><i class="fa fa-trash-o"></i></a></li> @foreach ($category->children as $children) <ul> <li>{{ $children->name }}</li> <li>{{ $children->description }}</li> <li>{{ $children->slug }}</li> <li></li> </ul> @endforeach </ul> @endforeach