我想在我的应用程序中实现页面查看计数器。到目前为止,我所做的是使用这个方法:
public function showpost($titleslug) {
$post = Post::where('titleslug','=',$titleslug)->firstOrFail();
$viewed = Session::get('viewed_post', []);
if (!in_array($post->id, $viewed)) {
$post->increment('views');
Session::push('viewed_post', $post->id);
}
return view('posts/show', compact('post', $post));
}
我检索的热门帖子列表如下:
$popular_posts = Post::orderBy('views', 'desc')->take(10)->get();
但是,我想知道是否有更好的方法来做到这一点?用我目前的方法,我可以得到一个列表,在过去的24小时内最受欢迎的职位?这是所有的,谢谢!
5条答案
按热度按时间dddzy1tm1#
正如@milo526的评论中所引用的,你可以用一种独特的方式来记录你的页面的所有点击量,而不是一个增量。这样你就有了很多可能性来搜索访问信息,包括按最多浏览次数排序的帖子列表。
创建表以保存视图记录:
然后,创建相应的模型:
最后,您的方法:
要搜索最近24小时内查看次数最多的帖子:
请注意,在PostsViews中,如果您不想考虑来自同一会话的命中,您可以使用一些数据来帮助进一步过滤您的列表,例如会话ID。
您可能需要根据最终代码调整此解决方案的某些方面。
ttcibm8c2#
2020更新(2)/为Laravel 6提供雄辩的关系
如果你不想在你的应用程序中添加一个包,我根据“让·马科斯”和“学习者”对这个问题的贡献以及我自己的研究开发了下面的解决方案。
所有的功劳都要归功于“让·马科斯”和“学习者”,我觉得我应该和学习者做同样的事情,以一种对他人有益的方式更新代码。
首先,确保数据库中有一个会话表。否则,请按照Laravel文档中的步骤操作:HTTP Session
确保会话存储在表中。如果没有,请确保将.env中的SESSION_DRIVER变量更改为'database'而不是'file',然后执行Composer转储-自动加载。
之后,您就可以开始了。您可以通过运行以下控制台命令来启动:
这将生成模型和迁移文件。
在迁移文件中放入以下Schema。注意列名。例如,我的posts表的列名为“slug”,而不是问题中提到的“titleslug”。
然后将以下代码放入PostView模型文件中。
现在,在Post模型中编写以下代码,以创建posts表和post_views表之间的关系。
在同一个Post模型中,你应该放置下面的代码。如果用户没有登录,代码将测试IP匹配。否则,它将测试会话ID和用户ID,因为每个用户可能有多个会话。
现在您已准备好运行迁移。
当用户请求post时,应在PostController文件中指定以下函数:
因为我在post表中有一个单独的视图列。要搜索过去24小时内浏览次数最多的帖子,请在控制器中编写以下代码。如果没有分页,请删除paginate:
我希望这能帮助/保存一些人的时间。
dfty9e193#
2020更新
首先,非常感谢"让·马科斯"给出了他令人敬畏的答案。所有的功劳都归他,我只是结合我对拉拉维尔的了解粘贴了一个略有修改的答案。
创建一个表来保存视图记录,并使用snake_case的复数形式命名:帖子浏览次数
然后,创建相应的模型。请注意创建"PascalCase"模型名称和表的单数形式,因此它应该如下所示:* * 后视图**
然后运行迁移以生成此表
最后,您的方法:
要搜索最近24小时内查看次数最多的帖子:
请注意,在PostView中,如果您不想考虑来自同一会话的命中,您可以使用一些数据来帮助进一步过滤您的列表,例如会话ID。
您可能需要根据最终代码调整此解决方案的某些方面。
这些是我想指出的一些修改,您可能还想添加一个额外的列
client_internet_ip
,在其中可以存储\Request::ip()
,如果需要,它也可以用作过滤器。gupuwyp24#
Eloquent Viewable包可以用于此目的。它提供了更灵活的方法来做类似的事情(统计页面浏览量)。
注:Eloquent Viewable软件包需要PHP 7+和Laravel 5.5+。
使模型可见:
只需将Viewabletrait添加到模型定义中,如下所示:
然后在控制器中:
然后你可以做这样的事情:(see package installation guide for more details)
实现与已接受答案相同的想法,但提供更多功能和灵活性。
7gcisfzg5#
首先感谢user 33192分享了eloquent viewable,只是想让大家看完文档后更清楚一些,看看文档就可以安装包了。
在您的Post模型中执行此操作:
在您的posts控制器中,使用record方法保存一个视图;
在你的视图中,你可以返回你想要的视图(我的是posts.show)。更多信息请查看文档。我将只显示一个帖子的总视图。