muhammad_97
@muhammad_97
PHP-разработчик

Рекурсивный вывод категорий Laravel?

Здравствуйте. Делаю интернет-магазин на Laravel и уже на начальном этапе возникла загвоздка: не знаю как вывести список категорий. Есть таблица categories:

id - int
title - varchar
url - ЧПУ
parent_id - идентификатор родителя

и класс модели Category, у которого есть метод getSubCategories:

public function getSubCategories($categoryId)
{
	return Category::where('parent_id', '=', $categoryId);
}


Во вью layout/navigation.blade.php я и хотел сделать рекурсивный вывод. Подскажите, пожалуйста, как это можно реализовать?

P.S. Пытался сделать функцию в файле navigation, но Laravel ругается на фигурные скобки.

Пример:

<Ul>
	<li>Категория 1</li>
	<li>Категория 2
	<ul>
		<li>Подкатегория 1</li>
		<li>Подкатегория 2</li>
		<li>Подкатегория 3
		<ul>
			<li>Подкатегория 1</li>
			<li>Подкатегория 2</li>
			<li>Подкатегория 3</li>
		</ul>
		</li>
	</ul>
	</li>
	<li>Категория 3</li>
</Ul>


UPD.: Остановился на вложенных множествах
  • Вопрос задан
  • 3515 просмотров
Решения вопроса 2
AmdY
@AmdY
PHP и прочие вебштучки
Избавьтесь от меода, испольуйте связь на себя
public function children()
{
return $this->hasMany('Category', 'parent_id', 'id');
}

При выборке для оптимизации можно использовать Category::with('children'). Для вывода лучше написать рекурсивный blade helper, или использовать рекурсивный инклуд, проверяя наличие детей.
// template_name.blade.php
@foreach($items as $item)
@if ($item->children)
    @include('template_name', ['items' => $item->children])
@endif
@endforeach
Ответ написан
Вам стоит почитать про вложенные множества (nested sets) и их реализацию уже для laravel. Либо Material path или некие комбинации подобных техник. Не стоит убивать приложения бессмысленной рекурсией.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
uam
@uam
В блейде фигурных скобок кроме двойных или тройных быть не должно. Все остальное типа условий или циклов целается без скобок через собачку
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы