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