Schéma a vlastné modely
Balík používa dve tabuľky. Ich názvy určuje table_names; názvy stĺpcov sú pevné.
appointments
| Stĺpec | Typ | Poznámka |
|---|---|---|
id | bigint | Autoinkrementálny primárny kľúč. |
uuid | uuid, unique | Náhodná identita vyplnená pri vložení — nie je to kľúč. Z nej sa skladá UID v ICS. |
name | string | Názov termínu. |
description | text, nullable | Voľný popis. |
status | string, predvolene pending | Castuje sa na enum Status. |
meta | jsonb, nullable | Castuje sa na Collection. |
timezone | string, nullable | Pásmo, v ktorom bol termín rezervovaný; určuje lokálne zobrazenie. |
location | string, nullable | Názov miesta konania. |
latitude / longitude | decimal(10,7), nullable | Súradnice miesta; spoločný index, dostupné ako coordinates. |
starts_at | timestamp | Vždy v UTC, nech je app.timezone akékoľvek. Indexovaný samostatne aj spolu s ends_at. |
ends_at | timestamp, nullable | Vždy v UTC. Ak chýba, odvodí sa z trvania. |
duration_minutes | unsigned integer, nullable | Ak chýba, doplní sa z ends_at. |
recurrence_group | uuid, nullable | Spoločný pre všetky výskyty série; indexovaný. |
created_at / updated_at / deleted_at | timestamps | Soft deletes. |
appointment_participants
| Stĺpec | Typ | Poznámka |
|---|---|---|
id | bigint | Autoinkrementálny primárny kľúč. |
appointment_id | foreignId | Termín; obyčajný stĺpec bez obmedzenia na úrovni databázy. |
participant_type / participant_id | morphs | Zúčastnený model; typ participant_id určuje key_type. |
role | string, nullable | Castuje sa na enum ParticipantRole. |
meta | jsonb, nullable | Castuje sa na Collection. |
created_at / updated_at / deleted_at | timestamps | Soft deletes. Unikátny index na (appointment_id, participant_type, participant_id). |
Každý model sa môže termínu zúčastniť len raz — unikátny index pokrýva (appointment_id, participant_type, participant_id). Riadky účastníkov zmazané cez soft delete v tomto indexe zostávajú, preto opätovné pridanie odobraného účastníka obnoví jeho starý riadok s novou rolou a meta údajmi (ParticipantUpdated) namiesto vloženia druhého.
Typ kľúča účastníkov
key_type určuje typ polymorfného stĺpca participant_id: bigint pre predvolené autoinkrementálne kľúče Laravelu, uuid pre modely s HasUuids, ulid pre modely s HasUlids. Na veľkosti písmen nezáleží; iná hodnota pri spustení migrácií vyhodí InvalidConfigurationException, takže preklep nikdy nevytvorí nesprávny stĺpec. Všetky modely, ktoré pripájate ako účastníkov, musia mať rovnaký typ kľúča; vlastné tabuľky balíka majú vždy autoinkrementálne id. Nastavte ho pred publikovaním a spustením migrácií:
APPOINTMENTS_KEY_TYPE=uuiduse Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Foundation\Auth\User as Authenticatable;
use RoundlyConsulting\Appointments\Concerns\HasAppointments;
class User extends Authenticatable
{
use HasAppointments;
use HasUuids; // pairs with APPOINTMENTS_KEY_TYPE=uuid
}Vlastné modely
Nasmerujte appointments.model a appointments.participant na vlastné podtriedy, ak potrebujete ďalšie vzťahy, accessory či scopes. Rozšírte modely z balíka — zámerne nie sú final a prinášajú traity pre miesto konania, kontakty, hodnotenia a schvaľovanie:
namespace App\Models;
use RoundlyConsulting\Appointments\Models\Appointment;
use RoundlyConsulting\Appointments\Models\Participant;
class Booking extends Appointment
{
// Reads its table from appointments.table_names.appointments — nothing to set.
public function isToday(): bool
{
return $this->startsAtLocal()->isToday();
}
}
class BookingParticipant extends Participant
{
// Reads its table from appointments.table_names.participants — nothing to set.
}// config/appointments.php
'model' => App\Models\Booking::class,
'participant' => App\Models\BookingParticipant::class,- Oba modely si tabuľku čítajú z table_names — Appointment z table_names.appointments, Participant z table_names.participants — takže podtrieda s iným názvom triedy $table nepotrebuje.
- Nenastavený kľúč (chýbajúci, null alebo prázdny) použije model z balíka. Čokoľvek iné musí byť model z balíka alebo jeho podtrieda — trieda, ktorá ho nerozširuje, vyhodí InvalidConfigurationException s názvom kľúča, namiesto aby sa potichu nahradila.
- Vzťah participants pomenúva cudzí kľúč (appointment_id) explicitne, takže nahradený model nikdy nehľadá stĺpec odvodený od názvu svojej triedy.
- Akcie, trait HasAppointments, kontroly dostupnosti aj vzťah účastníka načítajú model z konfigurácie, takže vytvárajú a vracajú práve vašu podtriedu.
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.