SELECT sum(likes.like)
FROM places left OUTER JOIN media_items ON places.id = media_items.place_id
left OUTER JOIN likes ON media_items.id = likes.likeable_id
WHERE likes.likeable_type = 'App\\MediaItem'
AND places.id = 1;
вот такой запрос должен посчитать сумму лайков для определенного можно сказать альбома с фотографиями где у каждой фотографии своя сумма лайков. Но как его выполнить в контексте latavel не разобрался, пробывал так:
public function getRatingAttribute()
{
$sql = "SELECT sum(likes.like)
FROM places left OUTER JOIN media_items ON places.id = media_items.place_id
left OUTER JOIN likes ON media_items.id = likes.likeable_id
WHERE likes.likeable_type = 'App\\MediaItem'
AND places.id = 1;";
$result = DB::connection()->getPdo()->exec($sql);
return $result;
}
Пытался сделать это связями laravel, но получилось слишком много запросов при выводе списка альбомов чтобы сортировать их по рейтингу, который складывается из суммы лайков для самого альбома и суммы всех вложенных лайков для каждой вложенной в него фотографии.
вот так изначально было:
public function getRatingAttribute()
{
$mediaItems = $this->mediaItems;
$result = 0;
$result += $this->likes->sum('like');
foreach ($mediaItems as $mediaItem) {
$result += $mediaItem->likes->sum('like');
}
return $result;
}
- это естественно дает слишком много запросов.
В идеале понять как сделать нормальное количество запросов используя стандартные связи laravel. Ну или хотя бы как выполнить чистый sql запрос выше и в него воткнуть динамические данные.