Laravel отображает все родительские категории в виде дерева для определенной подкатегории

Я пытаюсь получить дерево категорий подкатегории

Допустим, у меня есть подкатегория под названием Аксессуары

В этой подкатегории есть родители электроники> Ноутбуки

Итак, это Электроника> Ноутбуки> Аксессуары

Таблица :

-----------------------------------------
| id    | parent_id     | name          |
|----   |-----------    |-------------  |
| 1     | 0             | Electronics   |
| 2     | 1             | Laptops       |
| 3     | 2             | Accessories   |
-----------------------------------------

Я могу получить корневую категорию подкатегории, как:

function getTopParent($category) {
    if($category->parent_id === null) {
        return $category->name;
    }

    return getTopParent(AppCategory::find($category->parent_id));

    // Will return Electronics

}

Также я знаю, как отображать категории, такие как дерево, см. Здесь

function printCategoryName($categories, $parentName = '') {
    foreach ($categories as $category) {
        $name = $parentName ? implode(' > ', [$parentName, $category->name]) : $category->name;
        echo sprintf('%s%s', $name, PHP_EOL);

        if (count($category->children) > 0) {
            printCategoryName($category->children, $name);
        }
    }
}

printCategoryName($categories);

Что мне нужно, это дать категорию, такую ​​как Аксессуары, получить дерево и получить дерево категорий для этой подкатегории:

Электроника> Ноутбуки> Аксессуары .

Как я могу достичь этого?

Всего 4 ответа


Вот как я получил это работает:

function getParentsTree($category, $name)
{
    if ($category->parent_id == null)
    {
        return $name;
    }

    $parent = Category::find($category->parent_id);
    $name = $parent->name . ' > ' . $name;

    return getParentsTree($parent, $name);
}   

$cat = Category::find(1);
echo getParentsTree($cat, $cat->name);

Выход: Electronics > Laptops > Accessories


Вы должны прочитать о модели вложенного множества


Это общая проблема, решаемая с помощью шаблона составного проекта.

Составьте объекты в древовидные структуры для представления иерархий всей части. Composite позволяет клиентам одинаково относиться к отдельным объектам и композициям объектов. Рекурсивная композиция «Каталоги содержат записи, каждая из которых может быть каталогом». 1-ко-многим "имеет иерархию" до "является"

Источник

Вы можете увидеть пример реализации шаблона составного дизайна с php здесь


Я использую эту структуру

Ваша модель входа в категорию AppCategory.php

class Categories extends Model
{
    public function parent()
    {
       return $this->hasOne('AppCategory', 'parent_id','id');
    }
    public function childiren()
    {
       return $this->hasMany('AppCategory', 'id','parent_id');
    }
}

ваш контроллер ExampleController.php

public function example()
{
    $data = Category::all();
    return view('index', compact('data'));
}

ваш клинок index.blade.php

<select>
    @foreach($data as $categories)
        <optgroup label="{{ $categories->name }}">
            @foreach($categories->children as $category)
                <option value="{{ $category->id }}">{{ $category->name }}</option>
            @endforeach
        </optgroup>
    @endforeach
</select>

также вы используете JQuery выберите 2

пример списка результатов


Есть идеи?

10000