列表模型如何按 DOWN-VOTES 的数量排序到相关模型 - laravel,雄辩
Posted
技术标签:
【中文标题】列表模型如何按 DOWN-VOTES 的数量排序到相关模型 - laravel,雄辩【英文标题】:how list model sorted by number of DOWN-VOTES cast to related model - laravel, eloquent 【发布时间】:2015-03-02 22:15:49 【问题描述】:感谢@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 列与相关实体的信息重复 - 我添加它是为了避免将额外的数据透视表与关于作者身份的信息加入。一个很好的现实例子:
为了将我的需求转化为 *** 模型,我现在可以将喜欢的人分配给帮助我的人(lukas 在我的表 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
但它超出了我的范围......
任何帮助表示赞赏。谢谢。
谢谢
【问题讨论】:
我找到了这个解决方案:randomsnippets.com/2008/10/05/…,但与用户相关的查询仍然存在问题。 【参考方案1】:在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'
);
【讨论】:
我不知道我是否理解你的意思。它有效吗?现在您想知道为什么吗? 您获得 karma_current_user 的建议效果很好。但是请在编辑后查看我原始帖子的底部。我需要的不是计算实体的投票数,而是首先计算 user_attitudes 和 entity_attitudes 对问题的不匹配;其次,用户对实体态度的投票。 好的,我吐了我的 user_attitudes 表。现在,新表包含用户对实体态度的态度。我仍然没有构建查询的想法...问题是:我应该保持用户对旧表中实体的态度,还是将它们移到新表中? 现在我们已经到了上次的地步。这是关于数据库设计的。我无法回答您,因为我不确切知道您的数据是如何构建和链接在一起的。而且我不想知道,因为我没有时间阅读我的内容。无论如何,做两个查询是完全可以的。 好的,我做到了——我可以数出不喜欢的书!我只是在我的 vew 中打印它有问题。请看一看!【参考方案2】:1) 如果分数永远不会从 -1、0 或 1 变化,那么你可以只做一个计数:
// Positive:
$positive = UserAttitude::where('importance', '>', 0)->count();
// Negative:
$negative = -1 * UserAttitude::where('importance', '<', 0)->count();
我假设一个名为 UserAttitude 的 Laravel 模型代表该表。如果您需要,应该不难适应更自定义的查询。
2) 不太确定您在此处查找的内容,因为为此特定查询添加另一个 where 子句不应更改总数。
【讨论】:
我需要重新考虑一下。查看我重新编辑的问题。我很可能会将您的建议用于稍后构建的更简单的小部件。谢谢以上是关于列表模型如何按 DOWN-VOTES 的数量排序到相关模型 - laravel,雄辩的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 模型按局部列和关系模型列值排序
您如何按包含标签的帖子数量对博客帖子标签列表进行排序(在 Eleventy 中使用 Nunjucks)?
如何使用自定义模型类按部分按字母顺序对 tableView 中的数据进行排序?