Účastníkmi nemusia byť len používatelia — cez polymorfnú tabuľku účastníkov sa môže zúčastniť akýkoľvek Eloquent model: zákazník, zamestnanec, zasadačka či vozidlo. Pridajte HasAppointments každému modelu, ktorý má vidieť svoje termíny:
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use RoundlyConsulting\Appointments\Concerns\HasAppointments;
class User extends Authenticatable
{
use HasAppointments;
}
class Room extends Model
{
use HasAppointments;
}
$user->appointments()->upcoming()->ordered()->get(); // appointments the user takes part in
$room->appointments()->between($monday, $friday)->get();
$user->appointmentParticipations; // the participant rows (MorphMany)appointments() vracia query builder, nie vzťah, takže pred get() môžete reťaziť ľubovoľné scopes. appointmentParticipations() je MorphMany riadkov účastníka.
Roly a meta údaje účastníka
Každému účastníkovi môžete dať voliteľnú rolu a ľubovoľné meta údaje — príznak hostiteľa, počet osôb, číslo miesta:
use RoundlyConsulting\Appointments\Enums\ParticipantRole;
use RoundlyConsulting\Appointments\Facades\Appointments;
Appointments::schedule('Property viewing')
->startingAt('2026-07-03 14:00')
->lasting(30)
->withParticipant($agent, ParticipantRole::Organiser)
->withParticipant($buyer, ParticipantRole::Attendee, ['party_size' => 2])
->withParticipant($partner, ParticipantRole::Optional)
->withParticipant($flat) // any Eloquent model — role stays null
->create();| Prípad | Hodnota | Poznámka |
|---|---|---|
ParticipantRole::Organiser | organiser | Osoba, ktorá termín vedie. |
ParticipantRole::Attendee | attendee | Vracia ho ParticipantRole::default(). |
ParticipantRole::Optional | optional | Pozvaný, no nie povinný. |
Čítanie účastníkov
$appointment->participants; // HasMany<Participant>, loaded after create()
$participant = $appointment->participants->first();
$participant->participant; // MorphTo — the underlying model (e.g. a User)
$participant->appointment; // BelongsTo<Appointment>
$participant->role; // ?ParticipantRole
$participant->meta?->get('party_size'); // meta is cast to a CollectionDodatočné pridávanie a odoberanie účastníkov
Appointments::for($appointment)->participants() spravuje, kto sa na jednej rezervácii zúčastňuje:
use RoundlyConsulting\Appointments\Enums\ParticipantRole;
use RoundlyConsulting\Appointments\Facades\Appointments;
$participants = Appointments::for($appointment)->participants();
$row = $participants->add($interpreter, ParticipantRole::Optional, meta: ['language' => 'sk']);
$participants->add($room, preventConflicts: true); // refuse if the room is booked then
$participants->has($interpreter); // true
$participants->all(); // the participant rows (role, meta), models eager-loaded
$participants->remove($interpreter); // by model…
$participants->remove($row); // …or by one of this appointment's participant rows- Pridanie modelu, ktorý sa už zúčastňuje, vyhodí DuplicateParticipantException.
- S preventConflicts: true (alebo prevent_conflicts v konfigurácii) pridanie modelu, ktorý má v čase termínu inú rezerváciu, vyhodí SchedulingConflictException.
- Odobratie modelu, ktorý sa nezúčastňuje — alebo riadka účastníka, ktorý patrí inému termínu — vyhodí ParticipantNotFoundException. Nič sa nezmaže.
- Odobratie zmaže riadok cez soft delete a spustí ParticipantDeleted. Opätovné pridanie toho istého modelu riadok obnoví s novou rolou a meta údajmi (ParticipantUpdated); prvé pridanie spustí ParticipantCreated.
Oba modely používajú soft deletes: zmazanie účastníka aj termínu ponechá riadok s časovou značkou deleted_at.
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.