Обход дерева иерархии (Laravel / PHP)

#php #laravel #hierarchy #laravel-7

#php #laravel #иерархия #laravel-7

Вопрос:

Я должен извлечь все левые и правые узлы определенного родительского узла. Это структура таблицы моей базы данных.

 Schema::create('user', function (Blueprint $table) {
    $table->id();
    $table->string('code')->unique();
    $table->string('parent_code');
    $table->enum('position', ['left', 'right', 'root']);
});
  
 $users= User::where('parent_code', $account->code)->where('position', 'left')->get();
$collect = new Collection();
do {
    foreach ($users as $item) {
        $level = User::where('parent_code', $item->code)->get();
        foreach ($level as $lvlitem) {
            $collect->push($lvlitem);
        }
    }
    $users = $collect;
} while (!$users->isEmpty());
  

Я попытался выполнить цикл от моего родительского элемента к его узлам, но, похоже, чем глубже это происходит, тем больше времени это займет.
Есть ли лучший способ обхода дерева?

Комментарии:

1. помогло бы добавить к вашему вопросу код, который показывает, как вы получили эти результаты. Также будьте точны в отношении глубины желаемых результатов.

2. @N69S Я уже отредактировал свой вопрос с помощью моего текущего кода.

Ответ №1:

Я бы предложил использовать уже созданный и протестированный пакет для подобных вещей.

И я также могу порекомендовать этот пакет для вложенного дерева:https://github.com/lazychaser/laravel-nestedset

Комментарии:

1. Спасибо, что предложили этот пакет. Я уже рассматривал этот пакет, но подумал, могу ли я найти другой способ без использования пакетов.

2. Использование package (почти) всегда лучше, чем создавать что-то самостоятельно и изобретать велосипед. Пакет уже протестирован. Пакет уже задокументирован. Пакет создан давно, и многие пользователи уже добавили отзывы (пакет улучшен). Пакет уже готов, поэтому вы можете потратить время на свою бизнес-модель, а не создавать что-то, что является лишь вспомогательной частью. Конечно, когда вам нужна более конкретная логика, и вы не можете найти пакет для этого или пакет имеет низкое качество — собственный код лучше [обычно].