ホームページ >データベース >mysql チュートリアル >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>
最終的には、特定の日に訪問者がページにアクセスするたびに個別の行が作成されることになりますが、これは望ましい結果ではありません。
解決策: 生のクエリと炭素日付の使用
この問題を解決する 1 つの解決策は、生の 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 中国語 Web サイトの他の関連記事を参照してください。