使用 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中文网其他相关文章!