Detekcia konfliktov
Ochranu pred dvojitou rezerváciou zapnete pre jedno volanie cez preventConflicts(). Ak má účastník prekrývajúcu sa rezerváciu, ešte pred akýmkoľvek zápisom sa vyhodí SchedulingConflictException, ktorá nesie kolidujúce termíny:
use RoundlyConsulting\Appointments\Exceptions\SchedulingConflictException;
use RoundlyConsulting\Appointments\Facades\Appointments;
try {
Appointments::schedule('Follow-up')
->startingAt('2026-07-01 09:30')
->lasting(60)
->withParticipant($doctor)
->preventConflicts()
->create();
} catch (SchedulingConflictException $e) {
$e->conflicts; // Collection<int, Appointment> — the bookings this slot overlaps
$e->getMessage(); // The requested time conflicts with 1 existing appointment(s).
}Prípadne strážte každé vytvorenie, presun aj pridanie účastníka v celej aplikácii:
// config/appointments.php — guard every create, reschedule and participant add
'prevent_conflicts' => true,Čo sa považuje za konflikt
- Existujúci termín koliduje, ak začína pred novým koncom a končí po novom začiatku. Nadväzujúce intervaly — jeden končí presne vtedy, keď ďalší začína — nekolidujú.
- Existujúci termín bez ends_at sa považuje za otvorený, bez konca.
- Zrušené a odmietnuté termíny sa ignorujú; čakajúce, potvrdené, dokončené aj termíny s neprítomnosťou sa rátajú.
- Pri vytvorení sa kontroluje každý účastník odovzdaný builderu alebo DTO. Pri presune sa kontrolujú aktuálni účastníci termínu a termín nikdy nekoliduje sám so sebou. Pri participants()->add() sa pridávaný model porovná s časom termínu.
- Príznak pre jedno volanie ochranu len zapína — pri prevent_conflicts nastavenom na true je strážené každé vytvorenie, presun aj pridanie účastníka.
- V opakovanej sérii sa kontroluje každý výskyt a jediný konflikt vráti späť celú sériu.
Bezpečné pri súbežnosti
Kontrola platí, aj keď dve požiadavky rezervujú tú istú osobu naraz. Prebieha v transakcii, ktorá zapisuje, po uzamknutí riadka každého účastníka — a pri presune či pridaní účastníka aj riadka termínu — takže dve súbežné rezervácie jednej osoby ňou nemôžu prejsť obe. Zámky sa berú vždy v rovnakom poradí, takže rezervácie so spoločnými účastníkmi sa navzájom nezablokujú. SQLite zámky riadkov nemá; zápisy namiesto toho radí za sebou.
Overenie dostupnosti
Opýtajte sa priamo fasády — napríklad na zašednutie obsadených slotov ešte predtým, ako si ich niekto vyberie. Obe metódy len čítajú a platia pre ne rovnaké pravidlá. $start a $end môžu byť inštancie Carbon v ľubovoľnom pásme; porovnávajú sa ako okamihy, ktoré predstavujú:
use RoundlyConsulting\Appointments\Facades\Appointments;
Appointments::isAvailable($doctor, $start, $end); // bool
Appointments::conflicts($doctor, $start, $end); // Collection<int, Appointment>
Appointments::conflicts($doctor, $start, $end, ignore: $appointment); // leave one booking outPrejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.