如何按照DOWN-VOTES的数量排序列表模型投射到相关模型 - laravel,eloquent

时间:2015-01-05 11:21:07

标签: php jquery laravel eloquent left-join

感谢@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数量对列表进行排序

卢卡斯提供的代码完成了这项工作:

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

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

每位作者都有一定数量的引语和出版的书籍。 用户可以UPVOTE和DOWNVOTE这些创作

表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(lukas已经提供代码)的终身成就预算

  • 此外,由同一实体(#51)编写的两本书(#32和#33)收到DOWN-VOTES的内容。

要做的事: 我需要列出实体(在这种情况下是科幻作家),并按照分配给他们创作的书籍的这些DOWN-VOTES对列表进行排序。在上面的例子中,作者得分为“-2”。

  • 注意:列entity_id复制了相关实体的信息 - 我添加了它以避免加入额外的数据透视表以及有关作者身份的信息。

一个很好的现实生活中的例子:

为了将我的想法转化为StackOverflow模型,我现在可以将喜欢分配给帮助我的人(lukas在我的表中获得+1 UP-VOTE user_attitudes.attitude)。我还可以列出所有收到我喜欢的用户。这个完成了。 现在,我希望看到用户排名按照他们对我自己的问题提供的答案数量排序。 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

我不知道此任务的语法规则。

我们需要额外的左手加入吗? Aftrer两个DB结构的变化我很困惑。 这可能会有所帮助: Laravel 4 query builder - with complicated left joins

Laravel Eloquent and Multiple Joins

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

任何帮助表示赞赏。谢谢。

THX

2 个答案:

答案 0 :(得分:2)

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 :(得分:0)

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

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

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

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

2)不太确定你在这里寻找什么,因为为这个特定查询添加另一个where子句不应该改变总数。