Как правильно сформировать такой запрос?
Имеется следующая таблица:
Мне нужно получить список всех комментариев к посту, чтобы вывести их подобным образом:
Причем комментарии должны выводитсся в порядке от старых до новых. Пробывал сделать так:
$comments = $post->comments()->whereNull('parent_id')->with(['user', 'childrens'])->get()->toArray(); // код функции comments public function comments() { return $this->hasMany(AppModelsComment::class, 'post_id', 'id'); } |
$comments = $post->comments()->whereNull('parent_id')->with(['user', 'childrens'])->get()->toArray(); // код функции comments public function comments() { return $this->hasMany(AppModelsComment::class, 'post_id', 'id'); }
Получаю все корневые комментарии(те, на которые никто не отвечал) + ответы на них, но комментарии, которые являются ответами на некорневые обьекты не берутся с бд.
Как можно сформировать такой запрос не прибегая к большому количеству отдельных запросов? Видел closure-table-comments, но не хочется подключать только для одной страницы. Еще думал создать отдельню колонку root_id, которая будет храить идендификатор корневого обьекта и выбирать по нему.
Дополнительно:
Указывайте точно СУБД, включая точную её версию.
Как можно сформировать такой запрос не прибегая к большому количеству отдельных запросов?
Recursive CTE.
PS. Если среднее количество деток у рутов будет невелико (в пределах десятка) - рекомендую перейти от parent-child на materialized path.
Проще всего рут комментарию давать парент_ид равный своему ид, тогда все становится элементарным - ордер по парент_ид, креатед_эт. При выводе просто проверять если парент = ид. А все коментарии которые ответы на ответы все равно писать как ответ на рут коментарий, так как они будут тупо по дате строиться, и разницы в принципе нет. Разве что вы хотите чтобы ветвление было бесконечным, тогда проще ввести рут_ид.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


Для того чтобы правильно сформировать запрос на сайте stackoverflow.com, следует придерживаться нескольких основных принципов:
1. Формулировка вопроса. Важно четко и ясно сформулировать свой вопрос, чтобы другие пользователи могли легко понять, что именно вы спрашиваете.
2. Предоставление контекста. При необходимости, укажите как можно больше информации о вашей проблеме: какой язык программирования используете, какие библиотеки, фреймворки и т.д.
3. Код. Если ваш вопрос связан с проблемой в коде, обязательно прикрепите его к вопросу. Используйте тег