Maison  >  Questions et réponses  >  le corps du texte

Comment vérifier si une période chevauche une autre période dans PHP Laravel

<p>Comment vérifier si les heures de travail d'un utilisateur spécifique pour une période donnée existent déjà dans la base de données. Par conséquent, la fonction doit renvoyer vrai lorsque les heures de travail chevauchent la date et l'heure données. Je l'ai essayé mais ça ne marche pas. </p> <pre class="brush:php;toolbar:false;">fonction checkExistingWorkingHours($user_id, $start_date, $start_time, $end_date, $end_time) { // jj($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) utiliser ($startDateTime, $endDateTime) { // Vérifie le chevauchement là où start_datetime se situe entre start_datetime et end_datetime existants $query->where(function ($query) utiliser ($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')); })->ouOù(fonction ($query) utiliser ($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')); }); })->ouOù(fonction ($query) utiliser ($startDateTime, $endDateTime) { // Vérifie le chevauchement là où end_datetime se situe entre start_datetime et end_datetime existants $query->where(function ($query) utiliser ($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')); })->ouOù(fonction ($query) utiliser ($startDateTime, $endDateTime) { $query->where('start_date', '<=', $startDateTime->format('Y-m-d')) ->where('end_date', '>=', $endDateTime->format('Y-m-d')); }); }); })->existe(); retourner $overlapExists ; }</pré> <p>Lorsque je teste la fonction avec les données suivantes, cela indique qu'il y a un chevauchement même s'il n'y en a pas.</p> <p>Vérifiez les heures de travail existantes (1, 2023-06-01, 00:15, 2023-06-01, 03:00) ;</p> <p>La valeur dans la base de données est le 01/06/2023 de 15h30 à 23h00. </p>
P粉011360903P粉011360903384 Il y a quelques jours534

répondre à tous(2)je répondrai

  • P粉515066518

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

    Essayez d'utiliser ceci

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

    répondre
    0
  • P粉014218124

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

    Réponse basée sur le commentaire de 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!");
    }

    répondre
    0
  • Annulerrépondre