如何按 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 已经提供了代码)
- 另外,由同一实体 (#51) 撰写的两本书(#32 和 #33)的内容收到 DOWN-VOTES。
要做的事情:
我需要列出实体(在本例中为 Sci-Fi 作者)并根据分配给他们创作的书籍的这些 DOWN-VOTES 对列表进行排序。在上面的例子中,作者得分为“-2”。
- 注意:entity_id 列与相关实体的信息重复 - 我添加它是为了避免将额外的枢轴 table 与有关作者身份的信息连接起来。
一个很好的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'
);
感谢@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 已经提供了代码)
- 另外,由同一实体 (#51) 撰写的两本书(#32 和 #33)的内容收到 DOWN-VOTES。
要做的事情: 我需要列出实体(在本例中为 Sci-Fi 作者)并根据分配给他们创作的书籍的这些 DOWN-VOTES 对列表进行排序。在上面的例子中,作者得分为“-2”。
- 注意:entity_id 列与相关实体的信息重复 - 我添加它是为了避免将额外的枢轴 table 与有关作者身份的信息连接起来。
一个很好的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'
);