Вывод дочерних элементов из коробки

01 Сентября 2021 00:01

Одна из базовых операций в laravel да и в любой системе, хотя даже используя чистый php - это вывод ресурсов из базы данных. Вывели ресурсы и тут же появляется потребность в выводе дочерних элементов каждого ресурса. Можно написать базовую функцию формирования дерева, но в случае с laravel можно использовать встроенный в laravel способ - это просто обратиться к свойству children в шаблоне blade.

Допустим есть такой контроллер:

class TaskController extends Controller
{
    public function index() {
        $columns = [
            'id',
            'title',
            'slug',
            'parent',
            'content',
            'is_published',
            'published_at',
            'user_id',
        ];
        $model = app(Task::class);
        $items = $model
            ->select($columns)
            ->where('parent', 0)
            ->orderBy('id','DESC')
            ->paginate(25);
        return view('tasks.list', compact('items'));
    }
}

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

<div class="card-body">
    <h5>Дочерние задачи</h5>
    @foreach($item->children as $k => $child)
        <div class="card-header">
            <h4 class="card-heading">
                <span>{{ $loop->index + 1 }}. </span><a href="{{ url('/user/tasks/' . $child->id . '/') }}">{{ $child->id }}</a>
            </h4>
        </div>
    @endforeach
</div>

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