最初に
今回、実務で「年」と「月」という風にフォームが分かれており、入力された値から年月日を取得して、その月の月初と月末を算出し、DBから範囲検索する処理を実装したので自分用のメモとして執筆致します。
まず「年」と「月」は下記のように入力フォームから値が送られる事が前提です。
$request->year //入力フォームから送られてくる年(例:2022)int型
$request->month //入力フォームから送られてくる月(例:2)int型
次に入力フォームから送られてきた値を基に、年月日を取得します。
if (!is_null($request->year) && !is_null($request->month) {
$date_time_from = Carbon::crateFromDate($request->year, $request->month, 1);
$date_time_to = $date_time_from->copy();
$start_month = $date_time_from->startOfMOnth();
$end_month = $date_time_from->endtOfMOnth();
$query = $query->whereBetween('daily_report_date', [$start_month, $end_month]);
Carbonについてオススメの記事はコチラです。(Carbonで日付や時間など操作できます)
まずCarbon::createFromDateで Y-m-d形式のCarbonインスタンスを作成します。第一引数にセットしたい年、第二引数にセットしたい月、第三引数にセットしたい日付を数値で定義します。
例を挙げると、年(2022)、月(2)、日(1)と定義すると2022-02-01 00:00:00という日付が作成出来ます。
$date_time_from = Carbon::crateFromDate($request->year, $request->month, 1);
次に$date_from
に格納した日付を$date_time_to
にコピーします。これは後に月初と月末を算出する際に同じCarbonインスタンスだと、$start_month
と$end_month
の両方が月末になってしまうからです。
$date_time_to = $date_time_from->copy();
$start_month = $date_time_from->startOfMOnth();
月初を取得(例:2022-02-01)
$end_month = $date_time_from->endtOfMOnth();
月末を取得(例:2022-02-28)
後は、検索対象の日付形式のカラムがdaily_report_date
なので、whereBetweenメソッドの第一引数に検索対象のカラムを記述し、第二引数に配列形式で開始日付を定義するだけです。
$query = $query->whereBetween('daily_report_date', [$start_month, $end_month]);
これで検索対象の日付形式のカラムから、開始日付が2022-02-01から、終了日付が2022-02-28までの範囲検索が可能になります。
以上となります!閲覧頂きありがとうございます!編集リクエストやアドバイスがあればコメント等で頂けますとありがたいです!宜しくお願い致します。