Opakované termíny
Odovzdajte builderu pravidlo RecurrenceData a zavolajte createRecurring(). Každý výskyt sa vytvorí ako samostatný termín a výskyty spája spoločné UUID v recurrence_group:
use RoundlyConsulting\Appointments\DataTransferObjects\RecurrenceData;
use RoundlyConsulting\Appointments\Enums\Frequency;
use RoundlyConsulting\Appointments\Facades\Appointments;
$series = Appointments::schedule('Weekly standup')
->startingAt('2026-07-06 09:00')
->lasting(30)
->withParticipant($team)
->recurring(new RecurrenceData(Frequency::Weekly, count: 8, byWeekday: [1])) // Mondays
->createRecurring(); // Collection<int, Appointment>Možnosti pravidla
| Pole | Typ | Predvolené | Význam |
|---|---|---|---|
frequency | Frequency | — | Frequency::Daily, Frequency::Weekly alebo Frequency::Monthly. |
interval | int | 1 | Každý N-tý deň, týždeň či mesiac — aspoň 1. |
until | ?CarbonImmutable | null | Posledný povolený začiatok, vrátane. Hodnota o polnoci sa číta ako dátum a zahŕňa celý ten deň. |
count | ?int | null | Maximálny počet výskytov — aspoň 1; strop je recurrence.max_occurrences. |
byWeekday | zoznam int | [] | ISO dni v týždni, ktoré nastanú v každom aktívnom dni, týždni či mesiaci — 1 = pondelok … 7 = nedeľa. |
Príklady
use Carbon\CarbonImmutable;
use RoundlyConsulting\Appointments\DataTransferObjects\RecurrenceData;
use RoundlyConsulting\Appointments\Enums\Frequency;
new RecurrenceData(Frequency::Daily, count: 5); // five consecutive days
new RecurrenceData(Frequency::Daily, interval: 2, count: 3); // every other day, three times
new RecurrenceData(Frequency::Weekly, interval: 2, until: CarbonImmutable::parse('2026-12-31 23:59'));
new RecurrenceData(Frequency::Monthly, count: 3); // from Jan 31: Feb 28, then Mar 31 — no overflow
new RecurrenceData(Frequency::Weekly, count: 4, byWeekday: [1, 3]); // Mondays and Wednesdays
new RecurrenceData(Frequency::Weekly, interval: 2, count: 6, byWeekday: [1, 3]); // Monday and Wednesday of every other week
new RecurrenceData(Frequency::Monthly, count: 8, byWeekday: [1]); // every Monday of each month
new RecurrenceData(Frequency::Daily, until: CarbonImmutable::parse('2026-07-31')); // midnight: a date, July 31 included
new RecurrenceData(Frequency::Daily, interval: 0); // throws InvalidRecurrenceExceptionAko sa séria vytvára
- Každý výskyt nesie všetko, čo by nieslo samostatné create() — účastníkov, meta údaje, miesto, súradnice, kontakty hostí aj vlastnú žiadosť o schválenie.
- Séria platí celá alebo vôbec: vytvára sa v jednej databázovej transakcii, takže ak ktorýkoľvek výskyt zlyhá — napríklad na SchedulingConflictException pri preventConflicts() — nezostane z nej nič, a keďže eventy čakajú na potvrdenie, nespustí sa pre ňu ani AppointmentCreated, ani event účastníka.
- Pravidlo sa rozvíja v pásme termínu, takže týždenný termín o 9:00 zostane o 9:00 miestneho času aj po zmene letného času.
- Bez filtra dní v týždni je prvým výskytom samotný začiatok a každý ďalší nasleduje o interval dní, týždňov či mesiacov neskôr. Mesačné kroky nikdy nepretečú: séria začínajúca 31. dňa pripadne v kratších mesiacoch na posledný deň.
- S byWeekday nastane od začiatku každý uvedený deň v týždni v každom aktívnom období — obdobím je deň, týždeň (od pondelka) alebo mesiac podľa frekvencie a aktívne je každé interval-té obdobie. interval: 2 s byWeekday: [1, 3] je pondelok a streda každý druhý týždeň; Frequency::Monthly s byWeekday: [1] je každý pondelok každého aktívneho mesiaca.
- until platí vrátane — výskyt začínajúci presne v čase until sa zachová. until o polnoci sa číta ako dátum a zahŕňa celý ten deň.
- Interval či počet pod jedna alebo deň v týždni mimo 1–7 vyhodí InvalidRecurrenceException už pri vytvorení RecurrenceData.
- Bez count aj until sa pravidlo rozvinie na recurrence.max_occurrences (predvolene 365) — otvorené pravidlá preto vždy ohraničte. Rovnaký strop platí aj pre count.
Z DTO
Appointments::createRecurring() prijme AppointmentData a pravidlo — alebo použije recurrence priamo z DTO. Bez akéhokoľvek pravidla vytvorí jediný termín:
use RoundlyConsulting\Appointments\DataTransferObjects\RecurrenceData;
use RoundlyConsulting\Appointments\Enums\Frequency;
use RoundlyConsulting\Appointments\Facades\Appointments;
$series = Appointments::createRecurring($appointmentData, new RecurrenceData(Frequency::Daily, count: 5));
$series = Appointments::createRecurring($appointmentData); // falls back to $appointmentData->recurrencePráca so sériou
Sériu načítate podľa recurrence_group; začiatky, ktoré pravidlo vytvorí, si vopred pozriete cez Appointments::occurrences() — nič sa nezapíše a platí rovnaký strop max_occurrences:
use Carbon\CarbonImmutable;
use RoundlyConsulting\Appointments\Facades\Appointments;
use RoundlyConsulting\Appointments\Models\Appointment;
// every appointment of one series
Appointment::query()
->where('recurrence_group', $series->first()->recurrence_group)
->ordered()
->get();
// preview the start times a rule produces, without writing anything
Appointments::occurrences(CarbonImmutable::parse('2026-07-06 09:00'), $rule); // list<CarbonImmutable>Prejavte 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.