Модель 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"
        }
    ];

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

2 ответа

Вам не нужно использовать отношения, чтобы сделать это дерево. Просто выберите все 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>

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

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

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

Другие вопросы по тегам