Laravelでデータベースを操作する際、日付に関連する条件で絞り込みたいケースは非常に多く存在します。例えば「特定の日に作成されたデータだけを取得したい」「ある期間に更新されたレコードを抽出したい」といったシナリオです。
この記事では、Eloquentで日付を条件にデータを絞り込む方法として whereDate、whereBetween、Carbon を組み合わせた実践的な使い方を紹介します。
whereDateで特定の日のデータを取得
whereDateは、日付型カラムから「年月日」だけを対象に絞り込むときに便利なメソッドです。例えば「2024年5月24日に作成されたレコードだけを取得する」場合は以下のように記述します。
use App\Models\Post;
use Carbon\Carbon;
$posts = Post::whereDate('created_at', '2024-05-24')->get();
created_atの時刻は無視され、「2024-05-24 00:00:00 ~ 2024-05-24 23:59:59」の範囲が対象になります。
whereBetweenで期間指定の検索を行う
日付の範囲でレコードを絞り込む場合は、whereBetweenが便利です。開始日と終了日を配列で渡すことで、その範囲に含まれるレコードを抽出できます。
$start = '2024-05-01';
$end = '2024-05-24';
$posts = Post::whereBetween('created_at', [$start, $end])->get();
この場合もcreated_atカラムの時刻部分まで含めた範囲になります。時刻を厳密に制御したい場合は、Carbonを使って指定するのがおすすめです。
Carbonで柔軟に日付を指定する
LaravelではCarbonライブラリが標準で利用できるため、日付の生成や操作が簡単です。
use Carbon\Carbon;
$start = Carbon::now()->subDays(7)->startOfDay(); // 7日前の0時
$end = Carbon::now()->endOfDay(); // 今日の23:59:59
$posts = Post::whereBetween('created_at', [$start, $end])->get();
このようにstartOfDay()やendOfDay()を使えば、時刻を含めた正確な期間での絞り込みが可能になります。
日付・時間を同時に条件に含めたいとき
時間まで含めて完全一致で検索したい場合は、whereとCarbonを組み合わせます。
$datetime = Carbon::createFromFormat('Y-m-d H:i:s', '2024-05-24 15:00:00');
$posts = Post::where('created_at', $datetime)->get();
ただし、完全一致はタイムスタンプが一致しない限りマッチしないため、範囲検索のほうが実用的なケースが多いです。
まとめ
LaravelのEloquentでは、日付を使った条件検索に複数のアプローチがあります。以下のように使い分けるのがポイントです。
whereDate:
特定の日だけを対象にしたいとき
whereBetween:
日付や時間の範囲で抽出したいとき
Carbon:
柔軟な日付操作が必要なとき
データの期間検索は多くのアプリケーションで必要となる処理ですので、これらのメソッドを適切に使いこなして、効率的なデータ取得を実現しましょう。