PHP Laravelで期間が別の期間と重複しているかどうかを確認する方法
<p>特定の期間における特定のユーザーの勤務時間がデータベースにすでに存在するかどうかを確認する方法。したがって、勤務時間が指定された日時に重なる場合、この関数は true を返す必要があります。試してみましたが、うまくいきません。 </p>
<pre class="brush:php;toolbar:false;">function checkExistingWorkingHours($user_id, $start_date, $start_time, $end_date, $end_time)
{
// dd($user_id . " " . $start_date . " " . $start_time . " " . $end_date . " " . $end_time);
$startDateTime = Carbon::parse($start_date . ' ' . $start_time);
$endDateTime = Carbon::parse($end_date . ' ' . $end_time);
$overlapExists = WorkingHour::where('user_id', $user_id)
->where(関数 ($query) use ($startDateTime, $endDateTime) {
$query->where(function ($query) use ($startDateTime, $endDateTime) {
// start_datetime が既存の start_datetime と end_datetime の間に重複があるかどうかを確認します
$query->where(function ($query) use ($startDateTime, $endDateTime) {
$query->where('start_date', '=', $startDateTime->format('Y-m-d'))
->where('start_time', '<', $endDateTime->format('H:i'))
->where('end_date', '=', $startDateTime->format('Y-m-d'))
->where('end_time', '>', $startDateTime->format('H:i'));
})->orWhere(function ($query) use ($startDateTime, $endDateTime) {
$query->where('start_date', '<', $startDateTime->format('Y-m-d'))
->where('end_date', '=', $startDateTime->format('Y-m-d'))
->where('end_time', '>', $startDateTime->format('H:i'));
});
})->orWhere(function ($query) use ($startDateTime, $endDateTime) {
// end_datetime が既存の start_datetime と end_datetime の間に重複があるかどうかを確認します
$query->where(function ($query) use ($startDateTime, $endDateTime) {
$query->where('start_date', '=', $endDateTime->format('Y-m-d'))
->where('end_date', '>=', $endDateTime->format('Y-m-d'))
->where('start_time', '<', $endDateTime->format('H:i'));
})->orWhere(function ($query) use ($startDateTime, $endDateTime) {
$query->where('start_date', '<=', $startDateTime->format('Y-m-d'))
->where('end_date', '>=', $endDateTime->format('Y-m-d'));
});
});
})->exists();
$overlapExists を返します。
}</pre>
<p>次のデータで関数をテストすると、重複がないにもかかわらず、重複があると表示されます。 </p>
<p>既存の稼働時間を確認します (1、2023-06-01、00:15、2023-06-01、03:00);</p>
<p>データベース内の値は 2023-06-01 03:30 ~ 11pm です。 </p>