Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 27.10.2014 16:18:32

Комментарии к записи

Всем привет! Не подскажите как грамотно организовать выборку типа: Есть список новостей и к каждой новости нужно достать по 3 последних комментария?
Что бы совсем понятней было, то аналогично тому, как это реализовано в ВК на стене. Тоесть - пост + 3 последних коммента.

Не в сети

#2 27.10.2014 16:54:08

Re: Комментарии к записи

А в чем проблема ? В терминах sql вышеописанное записывается как "ORDER BY created_at DESC LIMIT 3" . Теперь берется документация и пишется scope для модели в терминах ларавеловского query builder.

Не в сети

#3 27.10.2014 17:14:38

Re: Комментарии к записи

О "ORDER BY created_at DESC LIMIT 3" я в курсе. Меня интересует реализация что бы одним запросом (или несколькими) в итоге вернуть массив типа
array (
      array ("title" => "Статья","author" => "Автор","comments" => "массив с комментариями")
)

Не в сети

#4 27.10.2014 17:15:54

Re: Комментарии к записи

Что бы не делать в цикле запрос для получения комментариев

Не в сети

#5 27.10.2014 20:18:36

Re: Комментарии к записи

Делаем в модели 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)

Не в сети

#6 27.10.2014 23:35:33

Re: Комментарии к записи

Да да!! То что нужно)
Эм.. А еще вопрос, а если в таблице с комментариями там есть поле user_id и мне нужно достать еще и фотку и имя коментировавшего? Это в модели комментариев сделать belongsTo("user") ?

Не в сети

#7 28.10.2014 07:33:01

Re: Комментарии к записи

Да, и если этот метод называется author в запросе добавляем, если я не ошибаюсь, ->with("lastcomments.author") . Попробуй.

Не в сети

#8 28.10.2014 11:26:40

Re: Комментарии к записи

Не. Что-то NULL возвращает.

В модели с комментариями

public function commentuser()
    {
        return $this->belongsTo('User');
    }

И когда розпаковываю переменную, то : commentuser => null

Не в сети

#9 28.10.2014 12:36:30

Re: Комментарии к записи

C NULL-ом разобрался. Но тут дело в том, что вот этот ->limit(3) он достает последние 3 комментария ко всем записям, а мне нужно что бы к каждой из них было. Так получается, что у меня 10 постов и должно достаться например 30 комментариев. По 3 для каждого. А так он для 10-постов достает всего 3.

Не в сети

#10 28.10.2014 19:27:27

Re: Комментарии к записи

Разумеется, вы не можете сделать 1 запрос с разными комбинациями where+limit (то есть выбрать 3 последние поста для новости 1, 3 для новости 2, другие 3 для новости 3 и т.п.). Вам придётся делать по одному запросу на каждую новость + один запрос на выборку всех новостей (в первую очередь).

Хотя, вариант с 1 запросом для 3-х новостей есть (3 join’а), но он будет намного более убийственный для БД, чем просто нормальная выборка N+1. Если вы ещё закэшируете последние 3 поста для каждой новости где-то в Redis/memcached, то заметно сократите число запросов, а при редких обновлениях и вовсе до 1 (выборки последних новостей).

Не в сети

Подвал раздела