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
424
<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粉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!