---
title: "Schéma a vlastné modely — Appointments for Laravel | Roundly"
description: "Tabuľky termínov a účastníkov, kľúče účastníkov UUID/ULID a náhrada modelov Appointment a Participant vlastnými."
url: https://roundly-consulting.com/sk/open-source/navody/appointments-for-laravel/schema-a-modely
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Appointments for Laravel](https://roundly-consulting.com/sk/open-source/navody/appointments-for-laravel.md)

# 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í:

```bash
APPOINTMENTS_KEY_TYPE=uuid
```

```php
use 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:

```php
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.
}
```

```php
// 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 kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/appointments-for-laravel.md)
