もくじ
こういう要件があった
- 2020年4月スタートの計画だったら
2020年1〜12月の範囲のデータを取得 - 2020年9月スタートの計画だったら
2020年7〜12月のデータを取得
/** * 自身が関係している進行中の計画を取得 * * - 現在日時の半期分である * - 計画に自分がリーダをしている or メンバーとして参画している * - 失注していない ... plans.status_id ≠ 5 * * @param int $user_id - ユーザid * @return Illuminate\Support\Collection */ public function getMyOngoingPlans($user_id) { // 現在日時の半期分のデータを取得 $now = Carbon::now(); $setYear = $now->year; if ($now->month < 7) { $month['start'] = Carbon::create($setYear, 1, 1)->firstOfMonth()->format('Y-m-d H:i:s'); // 1日を固定で指定 $month['end'] = Carbon::create($setYear, 6, 1)->lastOfMonth()->format('Y-m-d H:i:s'); // 1日を固定で指定 } else { $month['start'] = Carbon::create($setYear, 7, 1)->firstOfMonth()->format('Y-m-d H:i:s'); $month['end'] = Carbon::create($setYear, 12, 1)->lastOfMonth()->format('Y-m-d H:i:s'); } $myPlans = self::select(['plan_id', 'plan_name', 'user_name', ]) ->whereBetween("plans.start_time", [$month['start'], $month['end']]) ->where('plans.status_id', '<', '5') ->where('plans.deleted','=', 0) ->where(function($query) use($user_id) { $query->where('plans.user_ids','like','%,'.$user_id.',%') ->orWhere('plans.user_id', $user_id); }) ->join('users','users.user_id','=','plans.user_id') ->get(); return $myPlans; }
Carbonを利用することで実装を行った。
Carbonによる日付と日付指定
// 現在日時の半期分のデータを取得 $now = Carbon::now(); $setYear = $now->year; if ($now->month < 7) { $month['start'] = Carbon::create($setYear, 1, 1)->firstOfMonth()->format('Y-m-d H:i:s'); // 1日を固定で指定 $month['end'] = Carbon::create($setYear, 12, 1)->lastOfMonth()->format('Y-m-d H:i:s'); // 1日を固定で指定 } else { $month['start'] = Carbon::create($setYear, 7, 1)->firstOfMonth()->format('Y-m-d H:i:s'); $month['end'] = Carbon::create($setYear, 12, 1)->lastOfMonth()->format('Y-m-d H:i:s'); }
範囲指定
querybuilderにてwhereBetween()で対応できる
->whereBetween("plans.start_time", [$month['start'], $month['end']])
Whereの優先順位
Whereの優先順位としてネスとしたい場合は無名関数を利用する
->where(function($query) use($user_id) { $query->where('plans.user_ids','like','%,'.$user_id.',%') ->orWhere('plans.user_id', $user_id); })