В основном я полностью озадачен этой проблемой. У меня есть модель в Laravel, определенная так
class BlogCategory extends Model
{
protected $table = 'blog_categories';
protected $fillable = [
'parent_id',
'title',
'slug'];
public function parent()
{
return $this->belongsTo('App\Models\BlogCategory','parent_id','blog_category_id');
}
public function children()
{
return $this->hasMany('App\Models\BlogCategory','blog_category_id','parent_id');
}
}
Теперь, как вы можете видеть, эта модель может иметь отношения родитель-потомок к себе.
Теперь, что я хочу использовать в виде дерева начальной загрузки, так это чтобы мои данные были отформатированы следующим образом:
var tree = [
{
text: "Parent 1",
nodes: [
{
text: "Child 1",
nodes: [
{
text: "Grandchild 1"},
{
text: "Grandchild 2"}
]
},
{
text: "Child 2"}
]
},
{
text: "Parent 2"},
{
text: "Parent 3"},
{
text: "Parent 4"},
{
text: "Parent 5"}
];
Как я могу достичь желаемого результата?
Вам не нужно использовать отношения, чтобы сделать это дерево. Просто выберите все BlogCategory
модели и рекурсивно повторять их, чтобы сделать дерево.
Например, вы можете использовать ответ здесь Рекурсивная функция для генерации многомерного массива из результата базы данных и принять его для своих нужд.
То, что я придумал в аналогичной ситуации с L-5.2, если вы хотите отобразить категории на нескольких уровнях, где для многоуровневых категорий поддерживается одна таблица, я думаю, это будет полезно.
id | category_id | name
1 NULL Main Category
2 1 -Sub-Category
3 1 -Sub Child
4 Null Second Main
5 4 -Second Sub
В категории модель
public function subcategory()
{
return $this->hasMany(Category::class);
}
затем в контроллере или где-либо вам нужно перечисление:
$categories = \App\Category::where('category_id', null)->get();
Затем это вы можете использовать в своем представлении:
<ul>
@foreach($categories as $category)
<li>{{ $category->name }}
@if(count( $category->subcategory) > 0 )
<ul>
@foreach($category->subcategory as $subcategory)
<li>{{ $subcategory->name }}</li>
{{-- If you want upto 3 level, then you can repeat above code with if condition here --}}
@endforeach
</ul>
@endif
</li>
@endforeach
</ul>
Это будет выглядеть примерно так:
Дайте мне знать, если это было полезно. Спасибо