Остановился на таком решение - в таблице комментариев добавил поле reply_ids которое хранит список id последних дочерних комментариев. Первым запросом получаю всех родителей. Со всех родителей собираю reply_ids в один массив. Вторым запросом получаю список дочерних комментариев по reply_ids. Ну и потом каждому родительскому комментарию добавляю атрибут replies с его дочерними комментариям, если они есть.
Konata Izumi, можно поподробнее насчет следить за актуальностью? А то может я где-то, что-то не додумал. Вы про удаление, добавление дочернего комментария?
да, про это.
Вам придется перед этим читать этот список, потом разбивать, потом искать нужный элемент, потом добавить удалить. Причем следить за дублированием.
В то же время используя связующую таблицу, за этим будет следить сама бд.
А каким образом может произойти дублирование? Я кстати ошибся в комментарии выше, в reply_ids хранятся id первых 5 ответов. Вы имели ввиду reply_ids вынести в отдельную табличку? Если да, то ведь в этой табличке тоже придется считать сколько кол. ответов, чтобы не превысить лимит ответов.
В контроллере создания комментария/ответа у родителя просто делаю апдейт поля reply_ids, а в модельки комментария мутатор уже разруливает как сохранить это поле.
public function setReplyIdsAttribute($value)
{
$replyIds = json_decode($this->attributes['reply_ids'], true);
if (count($replyIds) < 5) {
array_push($replyIds, $value);
}
$this->attributes['reply_ids'] = json_encode($replyIds);
}
Удаление еще не делал, но думаю там тоже все обойдется парой строчек кода.
Сайтец делаю для себя, по рукам бить не кто не будет.