So überprüfen Sie, ob sich ein Zeitraum mit einem anderen Zeitraum in PHP Laravel überschneidet
P粉011360903
2023-09-03 00:18:11
<p>So überprüfen Sie, ob die Arbeitsstunden eines bestimmten Benutzers für einen bestimmten Zeitraum bereits in der Datenbank vorhanden sind. Daher sollte die Funktion „true“ zurückgeben, wenn sich die Arbeitszeiten mit dem angegebenen Datum und der angegebenen Uhrzeit überschneiden. Ich habe es versucht, aber es funktioniert nicht. </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(function ($query) use ($startDateTime, $endDateTime) {
$query->where(function ($query) use ($startDateTime, $endDateTime) {
// Auf Überlappung prüfen, wenn start_datetime zwischen vorhandener start_datetime und end_datetime liegt
$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) {
// Auf Überlappung prüfen, wenn end_datetime zwischen vorhandenem start_datetime und end_datetime liegt
$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();
return $overlapExists;
}</pre>
<p>Wenn ich die Funktion mit den folgenden Daten teste, wird angezeigt, dass es eine Überlappung gibt, obwohl es keine Überlappung gibt.</p>
<p>Bestehende Arbeitszeiten prüfen (1, 01.06.2023, 00:15, 01.06.2023, 03:00);</p>
<p>Der Wert in der Datenbank ist 2023-06-01 15:30 bis 23:00 Uhr. </p>
尝试使用这个
根据geertjanknapen的评论回答: