首页 >数据库 >mysql教程 >如何使用 Laravel Eloquent 按天对数据库记录进行分组?

如何使用 Laravel Eloquent 按天对数据库记录进行分组?

Patricia Arquette
Patricia Arquette原创
2024-10-27 03:33:03749浏览

How to Group Database Records by Days Using Laravel Eloquent?

使用 Laravel Eloquent 查询按天分组的数据库记录

在使用数据库时,经常需要按一定的时间间隔聚合数据,例如天。就 Laravel Eloquent 而言,groupBy() 方法允许我们执行此类分组,但是像created_at 这样的基于时间的列在使用此方法时可能会带来挑战。

问题:按天分组考虑秒

出现此问题的原因是created_at 列通常包含小时、分钟和秒,导致同一天发生的事件的时间戳不同。因此,当按created_at进行分组时,同一天的记录可能会因时差而被分开。

例如,考虑以下示例数据:

created_at page_id user_id
2023-10-11 01:02:03 3 1
2023-10-12 12:34:56 5 5
2023-10-13 15:47:12 5 2
2023-10-13 18:23:09 3 4

如果我们尝试使用Eloquent命令通过created_at对这些数据进行分组:

<code class="php">$visitorTraffic = PageView::groupBy('created_at')->get();</code>

每次访问者在特定日期访问页面时,我们都会得到单独的行,这不是期望的结果。

解决方案:使用原始查询和碳日期

要解决此问题,一种解决方案是使用原始 SQL 查询。在MySQL中,DATE()函数可用于将时间戳转换为其相应的日期,允许我们按天分组而不考虑时间部分。可以使用以下查询:

<code class="sql">DB::table('page_views')
->selectRaw('DATE(created_at) AS date, COUNT(*) AS views')
->groupBy('date')
->get();</code>

或者,可以使用 Carbon 日期采用更以 Laravel Eloquent 为中心的方法:

<code class="php">$visitorTraffic = PageView::where('created_at', '>=', Carbon::now()->subMonth())
->groupBy(DB::raw('DATE(created_at)'))
->orderBy('date', 'DESC')
->get([
    DB::raw('DATE(created_at) AS date'),
    DB::raw('COUNT(*) AS views')
]);</code>

通过利用 DATE() 函数或 Carbon日期,我们可以按天对数据库记录进行分组,同时确保代表同一天的记录聚合在一起。

以上是如何使用 Laravel Eloquent 按天对数据库记录进行分组?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn