kur4chyt
@kur4chyt
Качественный говнокод от производителя

Как сортировать по количеству записей из связанной таблицы Laravel?

Имеется две таблицы:

1. adverts:
- id
2. likes:
- id
- advert_id
- user_id
- dislike

Для каждого лайка/дизлайка создаётся своя запись в таблице likes.
Если пользователь поставил дизлайк, то столбец dislike = 1, если лайк, то = 0.

Как можно вместе с пагинацией в 10 записей, отсортировать объявления (adverts) по количеству лайков(!).
То-есть первыми в списке выводить те записи, у которых больше лайков.
А самыми последними, те у которых больше дизлайков.
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fernus
@Fernus
Техник - Механик :)
SELECT `adverts`.*,
((SELECT COUNT(`likes`.`id`) FROM `likes` WHERE `likes`.`advert_id` = `adverts`.`id` AND `dislike` = 0) - (SELECT COUNT(`likes`.`id`) FROM `likes` WHERE `likes`.`advert_id` = `adverts`.`id` AND `dislike` = 1)) AS `ALL_LIKES`
FROM `adverts`
ORDER BY `ALL_LIKES` DESC


На ORM Laravel'я сам переведёшь?

UPD:
$rs = Advert:selectRaw('`adverts`.*, ((SELECT COUNT(`likes`.`id`) FROM `likes` WHERE `likes`.`advert_id` = `adverts`.`id` AND `dislike` = 0) - (SELECT COUNT(`likes`.`id`) FROM `likes` WHERE `likes`.`advert_id` = `adverts`.`id` AND `dislike` = 1)) AS `ALL_LIKES`')->orderBy('ALL_LIKES', 'DESC')->get();


P.S.:
Задумайтесь о хранении кол-ва лайков/дизлайков либо их соотношения прямо в поле у объявления...т.е. при каждом лайке/дизлайке обновляйте это поле...и тогда меньше придётся дёргать вторую таблицу для вывода объявлений...
Ответ написан
@jazzus
Самое простое и производительное - добавить поле scores в таблицу adverts
Инкрементить +10 баллов при ивенте лайк
Декрементить -10 баллов при ивенте дизлайк
Сортировать по orderByDesc scores

Сюдаже, в последствии можно добавить новые расчеты ранжирования с добавлением нового функционала
Например
инкрементить +20 баллов при добавлении юзером в избранное
и множество других метрик, которые просто покрываются тестами (проверка что при событии scores увеличился/уменьшился)
и таким образом формировать крутую сортировку)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы