Как в ларавел сделать сортировку по полям связи в виде дерева?

Есть две модели:
1) Категория. Сделал примерно как тут https://tjd-studio.com/blog/laravel-categories-wit... , уровней может быть только два!
2) Новость. Новости хранят category_id, при этом выбрать можно категорию любого уровня (1 или 2). Новостей очень много, нужно показать с пагинацией.

Категория 1
   Новость 53
   Новость 12
   - Подкатегория 1
       Новость 32
       Новость 23
   - Подкатегория 2
       Новость 21
       Новость 24
Категория 2
   Новость 1
   Новость 2
   - Подкатегория 3
       Новость 56
       Новость 57
[Пагинация]

Категорий и подкатегорий больше, но мы сейчас показываем N новостей на первой странице, а значит только несколько категорий, на след странице уже может быть другие категории.
т.е. мы должны взять первый N новостей отсортированных по связи category.name, пока думаю в сторону join'ов, но выходит нужно два раза джойнить, чтоб выбрать родителя категории.

Как проще тут поступить?
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
@Arik Автор вопроса
Пока сделал так:
$news = News::select('news.*')
    ->leftJoin('categories AS a', 'a.id', '=', 'news.category_id')
    ->leftJoin('categories AS b', 'b.id', '=', 'a.parent_id')
    ->orderByRaw('IF(b.id IS NULL, a.name, b.name)')
    ->orderByRaw('IF(b.id IS NULL, NULL, a.name)')
    ->orderBy('news.name')
    ->paginate($limit);


Вроде работает.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
Пишите запрос как вам нужно по бизнесу и заганяйте в кэш. Проблем с производительностью не будет даже без кэша.
Ответ написан
Ваш ответ на вопрос

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

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