Comment vérifier si une période chevauche une autre période dans PHP Laravel
P粉011360903
P粉011360903 2023-09-03 00:18:11
0
2
509

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.

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 ; } 

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.

Vérifiez les heures de travail existantes (1, 2023-06-01, 00:15, 2023-06-01, 03:00) ;

La valeur dans la base de données est le 01/06/2023 de 15h30 à 23h00.

P粉011360903
P粉011360903

répondre à tous (2)
P粉515066518

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();
    P粉014218124

    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!"); }
      Derniers téléchargements
      Plus>
      effets Web
      Code source du site Web
      Matériel du site Web
      Modèle frontal
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!