感谢@LukasGeiter的帮助,我改进了我的报价和书籍数据库。第四次编辑后,我将问题简化为:
我现在能够列出某些类型的作家,并按他们的重要性和分配给给定作者的"喜欢"和"不喜欢"对列表进行排序。
这是生成我的集合的代码:
$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)我想按特定用户分配给每个列出的作者的赞成票数对列表进行排序
lucas 贡献的代码完成了这项工作:
'SUM(IF(user_id = ' . Auth::user()->id . ', user_attitudes.attitude, 0)) AS karma_current_user'
现在我想要另一种排序方法:
每个作者都有一定数量的名言和出版的书籍。用户可以对这些创作投赞成票和反对票
在表中user_attitudes它看起来像这样:
> 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 对终身成就的反对票(卢卡斯已经提供了代码)
- 此外,由同一实体(#51)撰写的两本书(#32和#33)因其内容而获得了反对票。
要做的事情:我需要列出实体(在这种情况下是科幻作家),并按分配给他们撰写的书籍的这些反对票对列表进行排序。在上面的例子中,作者的得分为"-2"。
- 注意:entity_id列复制了相关实体的信息 - 我添加了它以避免加入额外的数据透视表,其中包含有关作者身份的信息。
一个很好的现实生活示例:
为了将我的需求转化为 StackOverflow 模型,我现在可以将喜欢分配给帮助我的人(lukas 在我的表格中获得 +1 赞成票 user_attitudes.attitude)。我还可以列出从我那里收到喜欢的所有用户。这已经完成了。现在,我想查看按用户对我自己的问题贡献的答案数量排序的用户排名。卢卡斯以大约 6 个答案在名单上排名第一......等。
可能的解决方案:
可能我只需要在此行中添加一个额外的 IF 子句
'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
我不知道此任务的语法规则。
我们需要一个额外的 leftJoin 吗?DB结构的两个变化我很困惑。以下内容可能会有所帮助:Laravel 4 查询生成器 - 具有复杂的左连接
拉拉维尔雄辩和多重连接
但它超出了我...
任何帮助表示赞赏。谢谢。
感谢
在内部使用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();
我假设一个名为UserAttitude的Laravel模型代表该表。如果需要,适应更自定义的查询应该不难。
2)不太确定您在这里要查找的内容,因为为此特定查询添加另一个where子句不应更改总数。