Я довольно новичок в 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 | | +-------------+------------------+------+-----+---------------------+----------------+
В настоящее время вы загружаете все категории (включая дочерние), а затем просматриваете их. Вы хотите только загрузить корневые категории (категории без родителя). Чтобы сделать это, измените свой метод контроллера только на загрузку категорий, где 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