Благодаря помощи @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 (Лукас уже предоставил код)
Вещь которую нужно сделать:
Мне нужно перечислить сущности (в данном случае писателей-фантастов) и отсортировать список по этим ВНИЗ, присвоенным книгам, которые они создали. В приведенном выше примере автор набрал «-2».
Чтобы перевести мое желание в модель 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 и несколько соединений
но это за мной …
Любая помощь приветствуется. Спасибо.
Спасибо
С помощью 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'
);
1) Если счет никогда не изменится с -1, 0 или 1, то вы можете просто сделать подсчет:
// Positive:
$positive = UserAttitude::where('importance', '>', 0)->count();
// Negative:
$negative = -1 * UserAttitude::where('importance', '<', 0)->count();
Я предполагаю модель Laravel с именем UserAttitude, которая представляет эту таблицу. Не должно быть трудно приспособиться к более индивидуальному запросу, если он вам нужен.
2) Не совсем уверен, что вы ищете здесь, так как добавление еще одного условия where для этого конкретного запроса не должно изменять итогов.