Laravelで日付・時間関係の操作をするときは、CarbonとwhereDateの組み合わせが最強。
「今日から遡って1週間以内に作成されたデータを抽出したい」
「特定の日から5日後のデータを取り出したい」
といった要望を実現できます。
実際にCarbonとwhereDateを使ってデータを取りだす方法を4つ紹介します。
まだ使ったことがない、という場合には、まずは下記でCarbonのライブラリをインストールしてみてくださいね。
1 |
composer require nesbot/carbon |
Laravel 特定の日付・時間のデータ取得にはCarbonとwhereDateを使おう
今回は、下記のテーブルからデータを取り出していきます。
まずはCarbonを使った基本的な使い方から。
① CarbonとwhereDateで本日作成したデータを抽出する方法
本日(2/26)作成されたデータを抽出してみます。
下記のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Http\Controllers; use App\Models\Dango; use Illuminate\Http\Request; use Carbon\Carbon; class HomeController extends Controller { public function test(Request $request) { // データベースから、今日作成されたデータをを取り出す $today=Carbon::today(); $dangos=Dango::whereDate('created_at', $today)->get(); return view('welcome', compact('dangos')); } } |
ポイントは、下記3点です。
- use宣言でCarbonを入れ忘れないようにする
- Carbon::today() で本日の日付を取り出す
- whereDateを使ってデータベースから値を探す
本日の日付は2月26日なので、下記のデータが抽出されます。
わたしは最初whereDateではなく、whereを使っていましたが、これだと うまくいかず。
うーん。なんでだろう??
と試行錯誤した後、whereDateにしないと日付を検出してくれないことが分かりました^^;
なお、プロジェクト作成後にTimezoneを変更していない場合には、Carbonの日付に時差が発生します。
config/app.php の ‘timezone’ を ‘Asia/Tokyo’ にしておきましょう!
② CarbonとwhereDateで1週間前に作成したデータを抽出する方法
次は本日(2/26)から1週間前に作成したデータを抽出してみます。
下記のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Http\Controllers; use App\Models\Dango; use Illuminate\Http\Request; use Carbon\Carbon; class HomeController extends Controller { public function test(Request $request) { // データベースから、今日から7日前に作成されたデータをを取り出す $sevendays=Carbon::today()->subDay(7); $dangos=Dango::whereDate('created_at', $sevendays)->get(); return view('welcome', compact('dangos')); } } |
subDayの後のカッコの中に、本日の日付から何日前にするか、数字を設定します。
今回は1週間前のデータを取り出したいので、subDay(7)としております。
本日の日付は2月26日。本日(2/26)から1週間前の2/19に作成された下記データが抽出されます。
なお subDay部分を変更すると、本日の日付から加算・減算して、色々な日付を抽出できます。
Carbonを組み合わせて良く使う、日付変更のためのメソッドを表にしておきますね。
【Carbonの日付を加算・減算するメソッド】
addHour() | 時間を加算 |
addDay() | 日付を加算 |
addMonth() | 月を加算 |
addYear() | 年を加算 |
subHour() | 時間を減算 |
subDay() | 日付を減算 |
subMonth | 月を減算 |
subYear() | 年を減算 |
③ CarbonとwhereDateで遡って7日以内に作成されたデータを抽出する方法
日付を指定してデータを取り出す場合には、「遡って〇日以内のデータ」と指定したいことも多々あります。
そんな場合には、不等号を使います。
たとえば、「今日(2/26)から遡って7日以内に作成されたデータ」を取り出す場合は、下記のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Http\Controllers; use App\Models\Dango; use Illuminate\Http\Request; use Carbon\Carbon; class HomeController extends Controller { public function test(Request $request) { // データベースから、今日から遡って7日以内に作成されたデータをを取り出す→じゅんことたけし $sevendays=Carbon::today()->subDay(7); $dangos=Dango::whereDate('created_at', '>=', $sevendays)->get(); return view('welcome', compact('dangos')); } } |
ポイントは、whereDateの後の設定で、‘<=’ を利用している点です。
これによって、作成日が本日(2/26)から遡って7日前より新しい日付のデータが全て取り出せます。
今回のデータベースでは、下記の3つのデータが抽出されます。
④ Carbon parse とwhereDateで特定の日付に作成されたデータを抽出する方法
ここまで「本日」を基準に日付を算出し、データを取得してきました。
ただ「本日」ではなく、特定の日付を基準にしてデータを取得することもできます。
たとえば、「dangosテーブルのcreated_atの日付が今日(2/26)から3日以内のデータ」を取り出す場合は、下記のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php namespace App\Http\Controllers; use App\Models\Dango; use Illuminate\Http\Request; use Carbon\Carbon; class HomeController extends Controller{ public function test(Request $request) { $dangos=Dango::all(); foreach($dangos as $dango){ $dangoday=Carbon::parse($dango->created_at); } $sevendays=Carbon::today()->subDay(3); $dangos=Dango::whereDate('created_at', '>=', $sevendays)->get(); return view('welcome', compact('dangos')); } } |
特定の日付は、Carbon::parse(特定の日付) を使って指定します。
この日付を元に、whereDateを使って、条件に合うデータを取り出します。
今回のデータベースでは、下記の3つのデータが抽出されます。
さいごに
CarbonとwhereDateを使ってデータを抽出する方法を4つ紹介しました。
Carbonの便利さが伝わったら嬉しいです。
なお、Laravelには定期的な処理を自動で実行できるスケジューラー機能も備わっています。
スケジューラー機能の中にCarbonを組み込めば、
- 登録後1週間たったユーザーにメールを送信する
- 作成されたデータを好きなタイミングで、所定の場所に転記する
など、色々なことができちゃいます。
ぜひお試しください♪
登録後のユーザーへ自動でメール送信する方法は下記で解説しているので、試してみたくなったら、併せて読んでくださいね。
コメント
>データベースから、今日から7日前に作成されたデータをを取り出す
この方法は、私が確認した環境では検索速度が遅くなりました。
確認DB:MariaDB10.6
カラムのデータタイプ:timestamp、index設定
データ件数:約30万件
この方法よりも、以下の方が早くなりました。
->where(“created_at”, “>=”, “NOW() – INTERVAL 7 DAY”)
情報ありがとうございます。