Laravel отображает все родительские категории в виде дерева для определенной подкатегории c - PullRequest
1 голос
/ 15 января 2020

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

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

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

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

Стол :

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

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

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

    return getTopParent(App\Category::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 ]

0 голосов
/ 15 января 2020

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

модель вашей входной категории App\Category.php

class Categories extends Model
{
    public function parent()
    {
       return $this->hasOne('App\Category', 'parent_id','id');
    }
    public function childiren()
    {
       return $this->hasMany('App\Category', '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

result list example

0 голосов
/ 15 января 2020

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

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

Источник

Пример реализации составного шаблона проектирования можно увидеть с помощью php здесь

0 голосов
/ 15 января 2020

Вот так у меня получилось:

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

0 голосов
/ 15 января 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...