So überprüfen Sie, ob sich ein Zeitraum mit einem anderen Zeitraum in PHP Laravel überschneidet
P粉011360903
P粉011360903 2023-09-03 00:18:11
0
2
606
<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>
P粉011360903
P粉011360903

Antworte allen(2)
P粉515066518

尝试使用这个

$start = Carbon::parse($start_date . ' ' . $start_time)->stratOfDay();
$end = Carbon::parse($end_date . ' ' . $end_time)->endOfDay();
$overlapExists = WorkingHour::where('user_id', $user_id)->whereBetween('your column',[$start , $end])->exists();
P粉014218124

根据geertjanknapen的评论回答:

$period = CarbonPeriod::create("$start_date $start_time", "$end_date $end_time");
$start = Carbon::create("$to_check->start_date $to_check->start_time");
$end = Carbon::create("$to_check->end_date $to_check->end_time");


if ($period->overlaps($start, $end)) {
    return redirect()->back()->withInput()->with('error',"Time is overlapping!");
}
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage