печать шаблонов рекурсивного дерева - PullRequest
0 голосов
/ 08 июня 2018

tree.blade.php

<ul>

@foreach($places as $p)
    <li>
     <a href="">{{ $p->name }}</a>

    @if($p->children->count())

          @include ('tree', ['places' => $p->children]) //recursion
    @endif
    </li>
@endforeach

</ul>

У меня есть 2 строки в моей базе данных, поэтому 2 является дочерним по отношению к 1, проблема в том, что при печати первого дерева оно возвращается ко второмуитерация, но эта вторая итерация является дочерней по отношению к первой, поэтому ее не следует печатать снова, это создало дублирование, как я должен предотвратить это в моем шаблоне блэйда

updated:

метод управления:

public function index()
{
    $data = [];
    $data['places'] = Place::with(['children', 'parent'])->get();

    return view('places/index', $data);
}

1 Ответ

0 голосов
/ 08 июня 2018

На данный момент у вас есть несколько вариантов.

1) Пусть Eloquent сделает тяжелую работу

Для приложений с небольшим / малым трафиком я бы сказалэтот подход хорош, но не слишком эффективен, поскольку он будет загружать каждое отношение одно за другим, однако он должен дать вам желаемые результаты:

$data['places'] = Place::whereNull('parent_id')->with('children')->get();

Проверка на parent_id, являющуюся null, получит толькокорневые элементы.

2) Построить дерево

Другой вариант, который был бы немного более эффективным (с точки зрения БД), заключается в загрузке всех категорий.и создайте дерево в вашем контроллере:

$allPlaces = Place::all();

function getChildren($places, $place)
{
    $children = $places->where('parent_id', $place->id)->all()
        ->map(function ($child) use ($places) {
            return getChildren($places, $child);
        });

    $place->setRelation('children', $children);

    return $place;
}

$data['places'] = $allPlaces
    ->filter(function ($place) {
        return is_null($place->parent_id);
    })
    ->map(function ($place) use ($allPlaces) {
        return getChildren($allPlaces, $place);
    });

3) Используйте вложенные наборы

На этом этапе может быть немного убито, но стоило бы иметьвзгляд на https://github.com/lazychaser/laravel-nestedset

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