
もくじ
こういう要件があった
- 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);
})

