この記事はLaravelで使う「whereDate」についての記事です。
Laravelでデータ取得をする際、条件指定に「where」を使うと思いますが、日付の条件にも「where」を使うと予期せぬエラーが発生します。
そういったケースと「whereDate」を使った解決策を紹介します。
この記事を読むメリット
- 日付を条件としたデータ取得で起こりがちなミスを避けられるようになる
- where,whereDate,whreBetweenの使い分けができるようになる
Laravelで日付を条件にデータ取得する際に起こるミス
それでは早速、日付を条件にデータ取得する例を紹介します。
ある指定した日付に作成されたユーザーを取得します。
mysql> select * from users;
+----+-------------+-------------------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
| id | name | email | email_verified_at | password | remember_token | created_at | updated_at |
+----+-------------+-------------------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
| 1 | blog_sample | blog_sample_test0309@test.com | NULL | $2y$10$kEPdKbsR9oDq0BMunwzXD.08smMY8giJRMvkeqUy5b1qUSH9GU6wW | NULL | 2024-03-09 12:44:30 | 2024-03-09 12:44:30 |
+----+-------------+-------------------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
今usersテーブルには「2024-03-09 12:44:30」に作成されたユーザーが存在しています。
そこで以下のようにwhereを使って「2024-03-09」に作成されたユーザーを取得してみます。
public function targetUsers()
{
$targetUsers = User::where('created_at', '2024-03-09')->get();
if ($targetUsers->isEmpty()) {
$message = '対象ユーザーいないよ!';
} else {
$message = '対象ユーザーいるよ!';
}
return view('target-users')
->with('message', $message);
}
「where(‘created_at’, ‘2024-03-09’)」を使って「2024年4月4日」に作成されたユーザーを取得するように見えます。
しかし、「if (isEmpty($targetUsers)」で存在チェックした結果は、$messageに「対象ユーザーいないよ!」が入ります。。
whereの条件に合致する「created_at」の値は「2024-03-09 00:00:00」のみだからです。
whereでは完全一致のものを取得するので日付だけをみてくれる機能はないからです。
仮に「2024-03-09 12:44:30」のものがあってもこのデータは取得されません。
エンジニアにおすすめ書籍
エンジニアになりたて、これから勉強を深めていきたいという方におすすめの書籍はこちら!
whereDateを使って日付単位の条件を指定する
そこで使えるのが「whereDate」になります。
whereDateはwhereの日付特化版です。
日付に関する検索を簡単に行うことができます。
先ほどのコードを修正すると以下のようになります。
public function targetUsers()
{
// whereでの取得
$targetUsers = User::where('created_at', '2024-03-09')->get();
// whereDateでの取得
$targetUsersByWhereDate = User::whereDate('created_at', '2024-03-09')->get();
if ($targetUsersByWhereDate->isEmpty()) {
$message = '対象ユーザーいないよ!';
} else {
$message = '対象ユーザーいるよ!';
}
return view('target-users')
->with('message', $message);
}
「where」から「whereDate」に変更しただけです。
すると$messageは「対象ユーザーいるよ!」となりました!
whereDateを使うと、日付の「0時から23時59分」までを対象にしてくれるので期待通りの結果を得ることができるようになります。
比較演算子も使える
もちろん、比較演算子を使って特定の日付以前、以降のデータ取得も可能です。
// 2024年3月9日以前に作成されたユーザー取得
$targetUsersByWhereDate = User::whereDate('created_at', '<=' '2024-03-09')->get();
// 2024年3月9日以降に作成されたユーザー取得
$targetUsersByWhereDate = User::whereDate('created_at', '<=' '2024-03-09')->get();
使い方はwhereと同じです。
orWhereDateで複数の日付を検索対象にできる
「orWhereDate」を使って複数の日付を検索対象にもできます。
whereDateを複数呼び出すことはできますが、AND検索になって存在するデータがどの条件にも当てはまらなくなるので注意です。
orWhereDateを使うようにしましょう。
whereBetweenで時間指定まですれば対応はできる
whereDateを紹介しましたが、whereBetweenを使って対応することもできます。
public function targetUsers()
{
// whereでの取得
$targetUsers = User::where('created_at', '2024-03-09')->get();
// whereDateでの取得
$targetUsersByWhereDate = User::whereDate('created_at', '2024-03-09')->get();
// whereDateでの取得
$targetUsersByWhereBetween = User::whereBetween('created_at', ['2024-03-09 00:00:00', '2024-03-09 23:59:59'])->get();
if ($targetUsersByWhereDate->isEmpty()) {
$message = '対象ユーザーいないよ!';
} else {
$message = '対象ユーザーいるよ!';
}
return view('target-users')
->with('message', $message);
}
whereBetweenは日付だけを検索対象にするなら必要ありません。
時間まで指定して日付の範囲指定をしたい場合は使うと便利です。
先ほどと同様にorWhereBetweenで複数検索ができます。
sql文ではDATE関数を使う
LaravelではWhereDate関数でしたが、素のsql文ではDATE関数を使う必要があります。
以下記事で詳しく紹介しているのでsql文を書く機会がある方は以下記事を参考にしてください!
日付を検索対象にするならwhereDateを使おう
いかがだったでしょうか。
まとめると以下のようになります。
- 日付指定範囲なら「whereDate」
- whereを日付指定で使用するなら時間指定まで厳密に指定する必要ある
- 時間も指定した範囲内で探すなら「whereBetween」
それぞれの特徴を理解して使い分けれるようにしましょう。
日付周りは予期せぬエラーが発生しやすいので整理しておくとスムーズです!