Как правильно сформировать такой запрос?

Ссылка скопирована
1 ответ

Имеется следующая таблица:

Как правильно сформировать такой запрос?

Мне нужно получить список всех комментариев к посту, чтобы вывести их подобным образом:

Как правильно сформировать такой запрос?

Причем комментарии должны выводитсся в порядке от старых до новых. Пробывал сделать так:

$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.

Проще всего рут комментарию давать парент_ид равный своему ид, тогда все становится элементарным - ордер по парент_ид, креатед_эт. При выводе просто проверять если парент = ид. А все коментарии которые ответы на ответы все равно писать как ответ на рут коментарий, так как они будут тупо по дате строиться, и разницы в принципе нет. Разве что вы хотите чтобы ветвление было бесконечным, тогда проще ввести рут_ид.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Сергей Миронов Ответ

Для того чтобы правильно сформировать запрос на сайте stackoverflow.com, следует придерживаться нескольких основных принципов:

1. Формулировка вопроса. Важно четко и ясно сформулировать свой вопрос, чтобы другие пользователи могли легко понять, что именно вы спрашиваете.

2. Предоставление контекста. При необходимости, укажите как можно больше информации о вашей проблеме: какой язык программирования используете, какие библиотеки, фреймворки и т.д.

3. Код. Если ваш вопрос связан с проблемой в коде, обязательно прикрепите его к вопросу. Используйте тег

 для подсветки синтаксиса кода на языке программирования PHP. Это поможет другим пользователям быстрее понять суть проблемы.

4. Ожидаемый результат. Укажите, что именно вы ожидаете получить в результате вашего запроса. Чем точнее и яснее будет сформулирован ваш ожидаемый результат, тем быстрее вы получите ответ.

5. Уважение. Помните, что на stackoverflow.com активно действует правило "быть дружелюбным и уважительным". Старайтесь сформулировать ваш вопрос так, чтобы он не содержал негативных или оскорбительных высказываний.

Соблюдая эти простые правила, вы сможете правильно сформировать запрос на сайте stackoverflow.com и получить быстрый и качественный ответ на ваш вопрос.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно