suchen

Heim  >  Fragen und Antworten  >  Hauptteil

So überprüfen Sie, ob sich ein Zeitraum mit einem anderen Zeitraum in PHP Laravel überschneidet

<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粉011360903P粉011360903437 Tage vor594

Antworte allen(2)Ich werde antworten

  • P粉515066518

    P粉5150665182023-09-03 16:58:44

    尝试使用这个

    $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();

    Antwort
    0
  • P粉014218124

    P粉0142181242023-09-03 12:51:18

    根据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!");
    }

    Antwort
    0
  • StornierenAntwort