Laravel-PopularityCount属性-排序依据

Laravel-PopularityCount属性-排序依据,laravel,eloquent,Laravel,Eloquent,我对结果排序/排序有问题。 基本上我有一个posts表,我根据它有多少评论和喜欢来计算受欢迎度。问题是,我还对结果进行分页。所以 当我用这种东西的时候 $Posts->paginate(5); $Posts->sortBy('popularity_count'); $Posts->get(); 它只对特定页面进行排序,因此,例如,第1页的结果具有人气计数,如:6,5,4,3,2,第二页有10,7,5,2,1。正如你所看到的,有一些文章的受欢迎程度为10,应该作为第一页的第一个

我对结果排序/排序有问题。 基本上我有一个posts表,我根据它有多少评论和喜欢来计算受欢迎度。问题是,我还对结果进行分页。所以 当我用这种东西的时候

$Posts->paginate(5);
$Posts->sortBy('popularity_count');
$Posts->get();
它只对特定页面进行排序,因此,例如,第1页的结果具有人气计数,如:6,5,4,3,2,第二页有10,7,5,2,1。正如你所看到的,有一些文章的受欢迎程度为10,应该作为第一页的第一个结果

当我尝试使用

 $Posts->orderBy('popularity_count')
它不工作,因为我的数据库中没有这样的列。有没有可能在不使用原始选择和连接的情况下实现我想要的?我的模型上有更多自定义属性

谢谢

编辑:


在获取数据之前,您应该对数据进行排序:

$Posts->orderBy('popularity_count')->paginate(5);

在分页后使用sortBy时,您只对5个项目的集合进行排序。

在实现方面,一个快速解决方案是使用oderByRaw:

$Posts->orderByRaw 选择计数* 来自喜欢 其中likes.post_id=posts.id + 选择计数* 根据评论 其中comments.post_id=posts.id *1.2说明 ; 然而,如果你的posts表很大,这将是非常缓慢的。您可以尝试创建一个包含两个连接和两个聚合的查询,但这不会有太大变化。只获取5行并不重要,每次都需要计算数据库中每个帖子的流行度

因此,如果性能有问题,可以在posts表中创建三个新的缓存列:

喜欢你吗 评论与计数 人气 带有“流行度”列的索引

每次插入或删除评论或类似内容时,您还需要更新相关帖子。我可能会用触发器

这样,您就可以使用orderBy'popularity'、'DESC'

您还可以使用post\u id、comments\u count、likes\u count、popularity列创建一个新的表post\u popularity,以便物理分离缓存的数据。但是,您需要加入:

$Posts->加入'post_popularity as pp','pp.post.id','=','Posts.id' ->orderBypp.popularity,“DESC”;
问题是,我的数据库中没有popularity\u count列,所以我不能使用OrderBy为什么在sortBy中使用它?你怎么计算受欢迎程度?我和sortBy犯了个错误,意识到这只是我知道的。我有函数PopularityCount和getPopularityCountAttribute来计算它。它可以正常工作,请发布该函数。另外,如果你解释文章和其他流行模型之间的关系,我相信我们能帮到你。我已经用popularityCount方法更新了我的原始文章尝试使用DB::raw sql查询。。。但是我不知道如何编写查询。我相信这将是最好的方式添加喜欢计数,评论计数和人气计数到数据库。它将具有最好的性能,而且速度会快得多。每次有人评论或喜欢这篇文章时,更新它应该不会花费太多时间。在未来取决于有多少人将使用该网站,我将不得不使用SOLR或ElasticSearch可能。谢谢你的帮助!
$Posts->orderBy('popularity_count')->paginate(5);