概要
Laravelで日付と比較する方法をお伝えします。
where
句だけでなく、whereRaw
やwhereBetween
など、
意外と便利な書き方がありとても勉強になりました。
少し躓いたポイントも含め備忘録として残します。
where / whereRaw / whereBetween
where
カラムAより前
->wherer('カラムA', '>', '比較するカラム')
今より前
->wherer('NOW()', '>', '比較するカラム')
昨日より前
->wherer('NOW() - INTERVSL 1 day', '>', '比較するカラム')
whereRaw
SQLを使いたいとき
例えば、DATETIME(1990-01-01 00:00:00)でDBに保管されているcreated_at
と、
入力された年月(1990-02)を比較したいとき、比較するにはフォーマットを揃える必要があります。
このようなときは、SQLのDATE_FORMAT()
でを使います。
$yearMonth = '1990-02';
->whererRaw("DATE_FORMAT(カラム, 'フォーマット') <= ?", [$yearMonth])
SQLは "
もしくは '
で囲んで文字列にする
第2引数の変数は配列にする
インジェクション対策のために ?
を使ってバインドする
whereBetween
カラムAとカラムBの間のカラムを検索したいとき
現在時刻に応じて、言葉を表示させるたい場合
朝の7時のときは「おはよう」のレコードを取得したいです。
->where
を2つ使ってもできそうですが、
期間を検索したいときには->whereBetween
を使うと便利です。
->whererBetween(検索対象, [開始, 終了])
現在時刻はNOW()で指定して、
->whererBetween(DB::raw('NOW()'), [DB::raw('開始時間のカラム'), DB::raw('終了時間のカラム')])