如何列出模型按投到相关模型的 DOWN-VOTE 数排序 - 拉拉维尔,雄辩


how list model sorted by number of DOWN-VOTES cast to related model - laravel, eloquent

感谢@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子句不应更改总数。