---
title: "Modely a schéma — Events for Laravel | Roundly"
description: "Sedem tabuliek a sedem modelov, čo číta model Event, jeho query scopes, enumy, DTO a kontrakty a výmena modelu."
url: https://roundly-consulting.com/sk/open-source/navody/events-for-laravel/modely-a-schema
language: sk
---

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

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

# Modely a schéma

Sedem tabuliek, sedem modelov. Každý model ukladá časové značky v UTC bez ohľadu na app.timezone. Zapisujte cez fasádu, nikdy cez save() na týchto modeloch — handle udržiava miesta, počítadlá, notifikácie, zámky aj fake v poriadku. Modely slúžia na čítanie, vzťahy a scopes.

## Tabuľky

events-migrations publikuje sedem anonymných migrácií len smerom vpred (bez down()), s časovou značkou z publikovania a nikdy nenačítaných automaticky. Morph dvojice sú <name>\_type (reťazec) + <name>\_id (nakonfigurovaný typ kľúča). Preložiteľné stĺpce a slugy sú na PostgreSQL jsonb a na MySQL json.

| Tabuľka | Konfigurácia | Obsahuje |
| --- | --- | --- |
| `event_venues` | `tables.venues` | Preložiteľný názov, unikátny slug, morph vlastníka (null = zdieľané), street, city, region, postal\_code, country\_code (ISO 3166-1 alpha-2), formatted\_address, latitude / longitude (decimal 10,7, indexované pre ohraničujúci obdĺžnik), timezone, capacity (informatívna), geocoded\_at, súkromné meta. Soft delete. |
| `events` | `tables.events` | uuid (kľúč routy, kľúč na zdieľanie, UID v kalendári), slug pre každý jazyk, title, description, morph organizátora, venue\_id (restrict), šifrovaný online\_url, status, visibility, attendance\_mode, timezone, starts\_at / ends\_at (UTC), doors\_open\_at, previous\_starts\_at, starts\_on / ends\_on (miestne dni), all\_day, časové značky lifecycle, moved\_online\_at, capacity, max\_guests, príznaky čakacej listiny, okno RSVP, guest\_list, show\_counts, reminders, počítadlá (seats\_taken, going\_count, interested\_count, waitlist\_count), sequence, súkromné meta. Soft delete. |
| `event_admission_tiers` | `tables.tiers` | event\_id (cascade), key (unikátny v rámci podujatia vrátane zmazaných), preložiteľný názov a popis, price + price\_currency (null = zadarmo), capacity, seats\_taken, obdobie predaja, min\_party / max\_party, hidden, position. Soft delete. |
| `event_rsvps` | `tables.rsvps` | event\_id (cascade), morph účastníka (jedno RSVP na účastníka a podujatie), tier\_id (restrict), status, guests, note, waitlisted\_at (poradie vo fronte), held\_until, hold\_key, payment\_reference (unikátny), payment\_url, amount, confirmed\_at, responded\_at, šifrovaný check\_in\_code + jeho hash (unikátny), checked\_in\_at, checked\_in\_guests, check\_in\_method, morphy checked\_in\_by / added\_by / removed\_by, súkromné meta. Bez soft delete — jeho zmazaním je not\_going. |
| `event_hosts` | `tables.hosts` | event\_id (cascade), morph spoluorganizátora (unikátny v rámci podujatia), morph added\_by, created\_at. Odobratie spoluorganizátora zmaže riadok. |
| `event_invitations` | `tables.invitations` | event\_id (cascade), morph pozvaného (unikátny v rámci podujatia), morph invited\_by, status, message, token\_hash (ukladá sa len hash), responded\_at. Bez stĺpca expirácie — odkaz vyprší pri aktuálnom začiatku podujatia. |
| `event_reminder_deliveries` | `tables.reminder_deliveries` | event\_id (cascade), offset, starts\_at, dispatched\_at, recipients. Unikátne (event\_id, offset, starts\_at) — vloženie riadku je nárok, vďaka ktorému sa pripomienka pošle raz. |

Tabuľka events má indexy pre zoznamy (visibility, status, starts\_at), začiatok, koniec, miestne dni, miesto konania a organizátora. Indexy slugov pre jednotlivé jazyky pokrývajú translatable.locales v čase migrácie; index neskôr pridaného jazyka doplníte cez php artisan sluggable:indexes s názvom triedy modelu podujatia.

## Modely

| Model | Konfigurácia | Poznámky |
| --- | --- | --- |
| `Models\Event` | `models.event` | HasMedia, LifecycleSubject, Sluggable, Taggable, Translatable; skrýva organizer\_type, online\_url a meta. |
| `Models\Venue` | `models.venue` | Preložiteľný názov, HasSlug, HasLocation z geolocation (atribút coordinates); skrýva owner\_type a meta. |
| `Models\AdmissionTier` | `models.tier` | Preložiteľný názov a popis; price cez AsMoney z money-for-laravel. |
| `Models\Rsvp` | `models.rsvp` | Skrýva morph typy, check\_in\_code, jeho hash, payment\_url a meta; amount je Money, check\_in\_code je šifrovaný. |
| `Models\EventHost` | final | event(), host(), addedBy(). |
| `Models\EventInvitation` | final | event(), invitee(), invitedBy(), isPending(), expiresAt() (aktuálny začiatok podujatia; null, kým je odložené) a $plainToken — nastavený len na inštancii, ktorú vráti send(), nikdy sa neukladá. |
| `Models\ReminderDelivery` | final | event(). |

## Model Event

Vzťahy: venue() (vrátane zmazaných miest konania), organizer() (MorphTo; null, keď jeho riadok zanikne), tiers() (podľa position, potom id), rsvps(), hosts() a invitations(). Casty: status na enum stavov nakonfigurovaného životného cyklu; visibility, attendance\_mode a guest\_list na ich enumy; online\_url šifrovane; každá časová značka ako CarbonImmutable v UTC.

| Člen | Vracia | Poznámky |
| --- | --- | --- |
| `$event->phase` | `EventPhase` | Fáza aktuálneho stavu. |
| `$event->category / $event->labels` | `?Tag / Collection<Tag>` | Z pamäte, keď je načítaný vzťah tags. |
| `$event->poster` | `?Media` | — |
| `$event->distance_km` | `?float` | Nastaví withDistance(). |
| `posterUrl(string $variant = '')` | `?string` | Variant, keď je vygenerovaný, inak originál, inak events.poster.fallback\_url; nikdy nevyhodí výnimku. |
| `startsAtLocal() / endsAtLocal()` | `CarbonImmutable` | V časovom pásme podujatia. |
| `isUpcoming() / isOngoing() / isPast()` | `bool` | — |
| `seatsLeft()` | `?int` | null = bez obmedzenia. |
| `isFull()` | `bool` | — |
| `tagScope()` | `?Model` | Organizátor pri events.tags.scope = organizer, inak null. |
| `toIcs(?Model $viewer = null)` | `IcsCalendar` | \= Events::for($event)->ics($viewer). |
| `toJsonLd() / renderJsonLd()` | `?array / HtmlString` | Dáta schema.org alebo značka script (prázdna, keď sa negeneruje). |

## Query scopes

Každý filter API je jedným z týchto scopes, takže PHP aj HTTP filtrujú rovnako:

| Scope | Čo robí |
| --- | --- |
| `visibleTo(?Model $viewer)` | View z policy ako dotaz — pozrite Súkromie a oprávnenia. |
| `listed()` | Verejná viditeľnosť. |
| `published()` | Ohlásené: každá fáza okrem Draft. |
| `active()` | Scheduled alebo Rescheduled. |
| `inPhase(EventPhase ...$phases)` | Premietnuté na stavy nakonfigurovaného životného cyklu. |
| `atVenue(Venue\|int ...$venues)` | — |
| `online() · inPerson() · withAttendanceMode(AttendanceMode ...$modes)` | inPerson() je offline alebo mixed. |
| `organizedBy(Model $organizer)` | Bez podujatí, ktoré len spoluorganizuje. |
| `managedBy(Model $user)` | Podujatia, ktoré $user spravuje, vrátane konceptov. |
| `attendedBy(Model $attendee) · interestedBy(Model $attendee)` | Podľa stavu RSVP. |
| `free()` | Žiadny typ vstupenky s cenou. |
| `withSeatsAvailable()` | Voľné miesta alebo bez kapacity. |
| `search(string $term)` | Názov alebo popis obsahuje výraz — v ľubovoľnom jazyku, bez ohľadu na veľkosť písmen, so zneškodnenými zástupnými znakmi LIKE; prázdny výraz nepridá nič. |
| `popular()` | Najviac účastníkov ako prvé, potom najbližšie. |
| `upcoming() · ongoing() · past() · between() · startingBetween() · onLocalDate()` | Pozrite Čas a časové pásma. |
| `inCategory() · labelled() · uncategorized()` | Pozrite Kategórie a štítky. |
| `near() · withDistance() · orderByDistance()` | Pozrite Miesta konania a hľadanie v okolí. |

```php
use RoundlyConsulting\Events\Models\Event;

Event::query()->visibleTo($user)->listed()->active()->free()->withSeatsAvailable()
    ->search('jazz')->popular()->paginate();

Event::query()->managedBy($user)->get();          // the events $user manages, drafts included
Event::query()->organizedBy($team)->upcoming()->get();
Event::query()->atVenue($venue)->inPerson()->get();
```

Route-model binding používa uuid (getRouteKeyName()); chybné uuid je 404 bez dotazu. Binding neuplatňuje žiadne pravidlo viditeľnosti — overte view. Trvalé zmazanie odstráni súbory plagátu (media-library sama nič neodstráni); soft delete ich ponechá.

## Venue, AdmissionTier a Rsvp

- Venue — vzťahy owner() a events(), formattedAddress(), atribút coordinates (?Coordinates), scopes ownedBy($owner) a near($point, $km) a k tomu withinRadius() z geolocation (samotný ohraničujúci obdĺžnik).
- AdmissionTier — event() (vrátane zmazaných); isFree(), isOnSale() (práve v období predaja) a seatsLeft(); price je Money alebo null.
- Rsvp — event(), attendee(), tier() (vrátane zmazaných) a checkedInBy(); isGoing(), isHeld(), isWaitlisted(), isInterested(), isCheckedIn(), partySize(), waitlistPosition(), paymentIdempotencyKey() (ev-hold-…), checkInCode() a checkInQr().

## Výmena modelu

```php
namespace App\Models;

final class Event extends \RoundlyConsulting\Events\Models\Event
{
    // your relations, casts, traits
}

// config/events.php
'models' => ['event' => App\Models\Event::class],
```

Vymeniteľné sú štyri modely — event, venue, tier a rsvp; EventHost, EventInvitation a ReminderDelivery sú final. Balík získava každý model cez toto miesto — vzťahy, dotazy, registráciu policy, typy štítkov aj factories —, takže vzniká a vracia sa vaša podtrieda. Trieda, ktorá nie je podtriedou modelu balíka, vyhodí InvalidConfigurationException z toolkitu s názvom kľúča.

## Enumy

| Enum | Hodnoty | Pomocníci |
| --- | --- | --- |
| `EventStatus` | Draft, Scheduled, Postponed, Rescheduled, Cancelled, Completed | Stavy dodaného životného cyklu; phase(), color() (gray, green, amber, blue, red, zinc). |
| `EventPhase` | Draft, Scheduled, Postponed, Rescheduled, Cancelled, Completed | To, čo čítajú všetky pravidlá balíka, nech sú vaše stavy akékoľvek; isTerminal(), isActive(), isPublished(). |
| `EventVerb` | Publish, Unpublish, Postpone, Reschedule, Cancel, Complete | Stavové slovesá handle. |
| `Visibility` | Public, Unlisted, Private | — |
| `AttendanceMode` | Offline, Online, Mixed | schemaOrg(): URL enumerácie schema.org. |
| `GuestList` | Hidden, Attendees, Public | — |
| `RsvpStatus` | Going, Held, Waitlisted, Interested, NotGoing, Expired | takesSeats() (Going, Held); color(). |
| `RsvpResponse` | Going, Interested, NotGoing | Odpoveď účastníka. |
| `CheckInMethod` | Code, Manual | — |
| `InvitationStatus` | Pending, Accepted, Declined, Revoked | — |
| `EventTagType` | Category (events:category), Label (events:label) | — |
| `EventOperation` | Jedna hodnota pre každý zaznamenaný zápis (50) | Pozrite Testovanie. |

Každý enum okrem EventOperation, EventTagType a FindingSeverity používa Helpers z enums-for-laravel: label() (preložený, v angličtine a slovenčine), labels(), values(), options(), toOptions(), fromName(), tryFromName(), is(), isIn(), validationRule() a ďalšie metódy tohto traitu. Slovenské popisy sú napríklad „Čaká na platbu“ pre RsvpStatus::Held, „Osobne aj online“ pre AttendanceMode::Mixed a „Ručne“ pre CheckInMethod::Manual:

```php
use RoundlyConsulting\Events\Enums\RsvpStatus;

RsvpStatus::Waitlisted->label();              // "On the waitlist" ("Na čakacej listine" in sk)
$rsvp->status->takesSeats();                   // going or held
$event->phase->isActive();                     // RSVPs and check-in run
```

## Dátové objekty

Každé DTO je final readonly s vlastnosťami v konštruktore. Vstupy:

| DTO | Polia |
| --- | --- |
| `CreateEventData` | title, organizer, schedule (ScheduleData) a každé pole buildera: description, venue, onlineUrl, attendanceMode, visibility, capacity, maxGuests, waitlist, waitlistAutoPromote, rsvpOpensAt, rsvpClosesAt, guestList, showCounts, reminders, slug, coHosts, tiers (list<TierData>), poster, posterDraft, category, labels, meta, actor. |
| `ScheduleData` | startsAt, endsAt, duration, allDayFrom, allDayThrough, doorsOpenAt, timezone — predvolene všetky null; isAllDay(). |
| `UpdateEventData` | Každé pole podujatia, predvolene Support\\NotGiven::Value (bez zmeny); null vymaže pole, ktoré môže byť prázdne; movesStart(). |
| `VenueData / UpdateVenueData` | name, address (AddressData), coordinates, timezone, capacity, owner, geocode, meta, actor / tie isté polia ako NotGiven, pričom address nahradí všetkých šesť stĺpcov adresy. |
| `AddressData` | street, city, region, postalCode, country, formatted |
| `TierData / UpdateTierData` | name, key, price (Money alebo desatinný reťazec), capacity, saleStartsAt, saleEndsAt, minParty (1), maxParty, hidden, position, description / to isté ako NotGiven. |
| `RsvpRequest` | attendee, response (RsvpResponse), tier, guests, note, actor |
| `EventFeedQuery` | category, label, organizer, venue, name (názov kalendára). |
| `SweepOptions / RepairOptions` | limit, chunk (100) / counts, orphans, dryRun, chunk (100) |

Výsledky:

| DTO | Polia |
| --- | --- |
| `CheckInResult` | rsvp, attendee, firstCheckIn, guests, checkedInAt, method |
| `EventCounts` | going (vrátane hostí), interested, waitlisted, seatsLeft |
| `PaymentRequest` | reference, url, expiresAt — to, čo vráti váš collector |
| `SweepResult` | events, expiredHolds, promoted, reminders, notified |
| `RepairReport` | eventsChecked, countersFixed, orphansReleased, dryRun |
| `DoctorFinding` | severity (FindingSeverity), check, message; toArray() |
| `PosterVariant` | name, width, height — jedna položka events.poster.variants |

## Kontrakty

| Kontrakt | Metódy | Predvolené a výmena |
| --- | --- | --- |
| `Organizer` | eventOrganizerName(), eventOrganizerUrl(), allowsEventManagementBy(Model $user), scopeManagingEventsFor(Builder $query, Model $user) | Na vašich modeloch organizátorov; predvolené hodnoty dáva Concerns\\OrganizesEvents. |
| `CollectsAdmissionPayment` | request(Rsvp $rsvp, Money $amount): ?PaymentRequest | Payments\\NoPaymentCollector; events.payments.collector. |
| `EventUrls` | event(Event $event), invitation(string $token), rsvp(Rsvp $rsvp) — each ?string | Support\\TemplateEventUrls; events.urls.resolver. |
| `CheckInCodes` | issue(Rsvp $rsvp), extract(string $input), hash(string $code) | Support\\RandomCheckInCodes, naviazaný cez bindIf — vlastný naviažte v service provideri. |
| `EventLifecycle` | transitionFor(EventVerb $verb): ?string | Lifecycle\\EventLifecycle; events.lifecycle. |
| `EventState` | phase(): EventPhase | Implementuje ho enum stavov vášho životného cyklu (dodáva sa EventStatus). |

## 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/events-for-laravel.md)
