Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет! Не подскажите как грамотно организовать выборку типа: Есть список новостей и к каждой новости нужно достать по 3 последних комментария?
Что бы совсем понятней было, то аналогично тому, как это реализовано в ВК на стене. Тоесть - пост + 3 последних коммента.
Не в сети
А в чем проблема ? В терминах sql вышеописанное записывается как "ORDER BY created_at DESC LIMIT 3" . Теперь берется документация и пишется scope для модели в терминах ларавеловского query builder.
Не в сети
О "ORDER BY created_at DESC LIMIT 3" я в курсе. Меня интересует реализация что бы одним запросом (или несколькими) в итоге вернуть массив типа
array (
array ("title" => "Статья","author" => "Автор","comments" => "массив с комментариями")
)
Не в сети
Что бы не делать в цикле запрос для получения комментариев
Не в сети
Делаем в модели Post следующую реляцию:
public function lastcomments()
{
return $this->hasMany('Comment')->orderBy('created_at','DESC')->limit(3);
}
И в запросе постов юзаем ->with('lastcomments')
Например, $posts = Post::where("user_id", $user_id)->where("is_draft", 0)->with("lastcomments")->get();
В итоге тут будет два запроса - один вынет все посты с заданным условием, второй - все 3 последних комментария у полученных постов. В $post->lastcomments будет коллекция из 3х последних комментариев у поста.
Изменено slider23 (27.10.2014 20:21:00)
Не в сети
Да да!! То что нужно)
Эм.. А еще вопрос, а если в таблице с комментариями там есть поле user_id и мне нужно достать еще и фотку и имя коментировавшего? Это в модели комментариев сделать belongsTo("user") ?
Не в сети
Да, и если этот метод называется author в запросе добавляем, если я не ошибаюсь, ->with("lastcomments.author") . Попробуй.
Не в сети
Не. Что-то NULL возвращает.
В модели с комментариями
public function commentuser()
{
return $this->belongsTo('User');
}
И когда розпаковываю переменную, то : commentuser => null
Не в сети
C NULL-ом разобрался. Но тут дело в том, что вот этот ->limit(3) он достает последние 3 комментария ко всем записям, а мне нужно что бы к каждой из них было. Так получается, что у меня 10 постов и должно достаться например 30 комментариев. По 3 для каждого. А так он для 10-постов достает всего 3.
Не в сети
Разумеется, вы не можете сделать 1 запрос с разными комбинациями where+limit (то есть выбрать 3 последние поста для новости 1, 3 для новости 2, другие 3 для новости 3 и т.п.). Вам придётся делать по одному запросу на каждую новость + один запрос на выборку всех новостей (в первую очередь).
Хотя, вариант с 1 запросом для 3-х новостей есть (3 join’а), но он будет намного более убийственный для БД, чем просто нормальная выборка N+1. Если вы ещё закэшируете последние 3 поста для каждой новости где-то в Redis/memcached, то заметно сократите число запросов, а при редких обновлениях и вовсе до 1 (выборки последних новостей).
Не в сети
Страницы 1