如何按 DOWN-VOTES 的数量排序的列表模型转换为相关模型 - laravel、eloquent

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

感谢@LukasGeiter 的帮助,我改进了我的语录和书籍数据库。 第 4 次编辑后,我将问题简化为:

我现在可以列出某些类型的作家,并根据他们的重要性对列表进行排序,'likes' & 'dislikes' 分配给给定的作者

这是生成我的 collection:

的代码
$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'

现在我想要另一种排序方式:

每位作者都有一定数量的引用和出版的书籍。 用户可以对这些作品投赞成票和投反对票

在 table 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 那里收到了对 life-time 成就的反对票(lukas 已经提供了代码)

要做的事情: 我需要列出实体(在本例中为 Sci-Fi 作者)并根据分配给他们创作的书籍的这些 DOWN-VOTES 对列表进行排序。在上面的例子中,作者得分为“-2”。

一个很好的real-life例子:

为了将我的需求转化为 Whosebug 模型,我现在可以为帮助我的人点赞(lukas 在我的 table user_attitudes.attitude 中获得 +1 UP-VOTE)。我还可以列出所有收到我喜欢的用户。这个做完了。 现在我想查看按用户对我自己的问题的回答数量排序的用户排名。 Lukas 凭借 c 获得榜单第一名。 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 吗? 在对数据库结构进行两次更改后,我感到很困惑。 这件事可能会有所帮助: Laravel 4 query builder - with complicated left joins

Laravel Eloquent and Multiple Joins

但这超出了我的范围...

感谢任何帮助。谢谢。

感谢

1) 如果分数永远不会从 -1、0 或 1 变化,那么你可以只做一个计数:

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

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

我假设一个名为 UserAttitude 的 Laravel 模型表示 table。如果需要,应该不难适应更自定义的查询。

2) 不太确定您在此处寻找什么,因为为此特定查询添加另一个 where 子句不应更改总数。

SUM() 里面使用 IF 应该可以。试试这个:

$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'
);