Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте.
Есть три таблицы: users (id, name), messages(id, user_id, text), likes(id, message_id, user_id)
Теперь я хочу получить 20 последних сообщений и при этом наиболее разумным способом для каждого сообщения получить, лайкал ли текущий пользователь его.
Как это можно сделать без ORM - я понимаю. Получаю последние 20 сообщений (мне они и так нужны). Выбираю из них их ID в массив. Запрашиваю у таблицы "likes" все лайки сделанные ЭТИМ пользователем, где message_id IN (массив ИД-шек), потом связать это уже не проблема.
Как это сделать с ОРМ - я тоже знаю, но мне не нравится. У каждого объекта message можно сделать метод isLikedByUser($uid), который будет стучаться в базу за каждой парой (user_id, message_id), но это 20 дополнительных запросов.
Собственно поэтому и хочу узнать каким образом в Ларавеле лучше всего организовать такие связи, чтоб это было и логично с т.з. парадигм ОРМ и ненапряжно для базы. Реальные таблицы содержат гораздо больше всяких данный, и выбираются не 20, а скажем порядка 100 сообщений.
Изменено AlSirik (16.02.2015 16:01:39)
Не в сети
Так есть же активная загрузка отношений:
Message::with('название отношения')->...
И не будет кучи запросов.
Не в сети
Но ведь "with" это всего лишь присоединение другой модели и это никак не подходит для
Теперь я хочу получить 20 последних сообщений и при этом наиболее разумным способом для каждого сообщения получить, лайкал ли текущий пользователь его.
хотя... если с замыканием...
$curuser_id = 4;
$messages= Message::with(['likes' => function($query) use ($curuser_id)
{
$query->where('user_id', '=',$curuser_id)->limit(1);
}])->orderBy('created_at','DESC')->limit(20)->get();
Получаем все посты независимо от автора, но с непустым likes, если есть лайк от пользователя с id = "$curuser_id".
Может и помочь. Или это неправильно?
Изменено AlSirik (21.02.2015 18:27:46)
Не в сети
Почему неправильно? Если запрос правильно составляется, и данные правильно вытягиваются, значит правильно.
Не в сети
Страницы 1