как модель списка сортируется по количеству голосов, выбранных для связанной модели — laravel, eloquent

Благодаря помощи @LukasGeiter я улучшил свою базу цитат и книг.
После 4-го редактирования я упростил мою проблему до этого:

Теперь я могу составить список писателей определенного типа и отсортировать их по важности и «лайкам». & неприязнь, назначенная данному автору

Это код, который производит мою коллекцию:

$targetted = Capacitytype::find($capacity);  // this selects Sci-Fi writers only from among all writers

$rank_entities_by_capacity = Entity::join('entity_capacitytypes', function($q) use ($capacity){
$q->on('entity_capacitytypes.entity_id', '=', 'entities.id');
$q->where('entity_capacitytypes.capacitytype_id','=', $capacity);
})->leftJoin('user_attitudes', function($q) {
$q->on('user_attitudes.entity_id', '=', 'entities.id');
$q->where('item_type', '=', 'entity');
})

->selectRaw('entities.*, SUM(user_attitudes.importance) AS importance'
, SUM(user_attitudes.attitude) AS attitude'
)
->groupBy('entities.id')
->orderBy('importance', 'desc')
->take(6)
->get();

Что мне нужно:

1) Я хочу отсортировать список по номеру UPVOTES, назначенному каждому из перечисленных авторов конкретным пользователем

Код, предоставленный lucas, делает работу:

 'SUM(IF(user_id = ' . Auth::user()->id . ', user_attitudes.attitude, 0)) AS karma_current_user'

Теперь я хочу другой метод сортировки:

У каждого автора есть определенное количество цитат и книг, опубликованных.
Пользователь может UPVOTE и DOWNVOTE эти творения

в таблице user_atttitude это выглядит так:

> id  |  item_id  |  item_type  | entity_id  | importance | attitude (VOTES) | creator_id> 1   |  51         | entity    | 51         | -1               |100

> 2   |  32         | book      | 51         | -1               |100

> 3   |  33         | book      | 51         | -1               |100

На простом английском:
— Сущность 51 получила отрицательный ответ за пожизненное достижение от пользователя # 100 (Лукас уже предоставил код)

  • кроме того, две книги (№ 32 и № 33), написанные одной и той же организацией (№ 51), получили ЗАГРУЗКИ за их содержание.

Вещь которую нужно сделать:
Мне нужно перечислить сущности (в данном случае писателей-фантастов) и отсортировать список по этим ВНИЗ, присвоенным книгам, которые они создали. В приведенном выше примере автор набрал «-2».

  • Примечание: столбец entity_id дублирует информацию о связанной сущности — я добавил ее, чтобы избежать объединения дополнительной сводной таблицы с информацией об авторстве.

Хороший пример из жизни:

Чтобы перевести мое желание в модель StackOverflow, теперь я могу назначать лайки людям, которые мне помогают (lukas получает +1 UP-VOTE в моей таблице user_atttitude.attitude). Я также могу перечислить всех пользователей, которые получили лайки от меня. Готово.
Теперь я хочу увидеть рейтинг пользователей, отсортированный по количеству ответов, которые они ответили на мои вопросы. Лукас получает 1-е место в списке с c. 6 ответов … и т. Д.

Возможное решение:

Возможно, мне нужно только добавить дополнительный пункт ЕСЛИ в этой строке

 'SUM(IF(user_id = ' . Auth::user()->id . ', user_attitudes.attitude, 0)) AS karma_for_books'

условия для добавления:

IF user_attitudes.item_type = book
IF user_attitudes.entity_id = (entity)....
IF attitude = '-1' // counting downwotes only

Я не знаю правила синтаксиса для этой задачи.

Нужен ли нам дополнительный левый джойн?
После двух изменений структуры БД я запутался.
Это может помочь:
Конструктор запросов Laravel 4 — со сложными левыми соединениями

Laravel Eloquent и несколько соединений

но это за мной …

Любая помощь приветствуется. Спасибо.

Спасибо

1

Решение

С помощью IF внутри внутри SUM() должно сработать. Попробуй это:

$selects = array(
// your existing selects
'SUM(IF(user_attitudes.attitude = -1, 1, 0)) AS dislikes',
'SUM(IF(user_attitudes.attitude = 1, 1, 0)) AS likes',
'SUM(IF(user_id = ' . Auth::user()->id . ', user_attitudes.attitude, 0)) AS karma_current_user'
);
2

Другие решения

1) Если счет никогда не изменится с -1, 0 или 1, то вы можете просто сделать подсчет:

// Positive:
$positive = UserAttitude::where('importance', '>', 0)->count();

// Negative:
$negative = -1 * UserAttitude::where('importance', '<', 0)->count();

Я предполагаю модель Laravel с именем UserAttitude, которая представляет эту таблицу. Не должно быть трудно приспособиться к более индивидуальному запросу, если он вам нужен.

2) Не совсем уверен, что вы ищете здесь, так как добавление еще одного условия where для этого конкретного запроса не должно изменять итогов.

0

По вопросам рекламы [email protected]