Модель Laravel для начальной загрузки в виде дерева

В основном я полностью озадачен этой проблемой. У меня есть модель в 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"}
];

Как я могу достичь желаемого результата?

0

Решение

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

Например, вы можете использовать ответ здесь Рекурсивная функция для генерации многомерного массива из результата базы данных и принять его для своих нужд.

0

Другие решения

То, что я придумал в аналогичной ситуации с 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>

Это будет выглядеть примерно так:

  • Главная категория
  • —Подкатегория
  • —Sub Child
  • Второй Главный
  • —Второй Sub

Дайте мне знать, если это было полезно. Спасибо

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector