---
title: "Databázová schéma a typ kľúča — Options for Laravel | Roundly"
description: "Jediná tabuľka options, ako key_type určuje stĺpce vlastníka pre kľúče bigint, UUID či ULID a ako nasadiť vlastný model."
url: https://roundly-consulting.com/sk/open-source/navody/options-for-laravel/databazova-schema
language: sk
---

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

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

# Databázová schéma a typ kľúča

Všetky hodnoty — globálne aj patriace vlastníkom — ukladá jediná tabuľka options:

```php
Schema::create('options', function (Blueprint $table) use ($keyType): void {
    $table->id();
    $table->morphKey('owner', $keyType, nullable: true); // owner_type + owner_id
    // 'global' or a hash of owner type + id, filled by the model
    $table->string('owner_scope', 32);
    $table->string('key')->index();
    $table->text('value')->nullable();
    $table->jsonb('meta')->nullable();
    $table->timestamps();
    $table->softDeletes();

    $table->index(['owner_type', 'owner_id', 'key']);
    $table->unique(['owner_scope', 'key']);
});
```

| Stĺpec | Typ | Poznámka |
| --- | --- | --- |
| `id` | bigint, autoinkrementálne | Primárny kľúč. |
| `owner_type / owner_id` | nullable morph (podľa key\_type) | Oba null = globálna hodnota; inak model, ktorému hodnota patrí. |
| `owner_scope` | string(32) | global alebo hash typu a id vlastníka. Model ho vyplní pri každom uložení; spolu s key je unikátny. |
| `key` | string, indexované | key() daného nastavenia. |
| `value` | text, nullable | Surový uložený reťazec — hodnota serializovaná cez svoj cast, pri šifrovaných nastaveniach zašifrovaná. Pri každom čítaní sa pretypuje späť. |
| `meta` | jsonb, nullable | Ľubovoľné metadáta, na modeli pretypované na Collection. |
| `created_at / updated_at` | timestamps | — |
| `deleted_at` | soft deletes | forget() riadok soft-zmaže. |

Riadok s prázdnymi owner\_type a owner\_id je globálna hodnota; každý iný riadok patrí modelu, na ktorý odkazuje. Zložený index nad (owner\_type, owner\_id, key) z vyhľadania v rámci rozsahu robí jediný indexovaný dopyt.

Unikátny index nad (owner\_scope, key) drží v tabuľke najviac jeden riadok na nastavenie a rozsah. Dva requesty, ktoré v tej istej chvíli zapíšu nové nastavenie, ho tak neuložia dvakrát — druhý zápis aktualizuje riadok prvého, a to aj v transakcii na MySQL, kde ten riadok znova načíta so zámkom — a soft-zmazaný riadok zabudnutého nastavenia znova použije najbližší set() alebo import.

## Typ kľúča vlastníkov

key\_type určuje typ polymorfných stĺpcov vlastníka. Opisuje modely, ktorým hodnoty patria — nikdy nie samotnú tabuľku options, tá má vždy autoinkrementálne id:

| key\_type | Stĺpce vlastníka | Použite, keď vaši vlastníci… |
| --- | --- | --- |
| `bigint` | nullableMorphs | používajú predvolené autoinkrementálne kľúče Laravelu (predvolené) |
| `uuid` | nullableUuidMorphs | používajú HasUuids |
| `ulid` | nullableUlidMorphs | používajú HasUlids |

Číta sa pri spustení migrácie, preto ho nastavte vopred. Na veľkosti písmen nezáleží; čokoľvek iné ako bigint, uuid alebo ulid pri spustení migrácie vyhodí InvalidConfigurationException — nič sa nenahrádza.

## Model Option

RoundlyConsulting\\Options\\Option je bežný Eloquent model so soft deletes, factory a vzťahom owner() typu morphTo. Stĺpec value nemá statický cast — každé nastavenie pri čítaní a zápise aplikuje vlastné castAs(). Užitočné členy:

```php
use RoundlyConsulting\Options\Option;

Option::query()->forOwner($user)->get();   // rows owned by $user
Option::query()->forOwner(null)->get();    // global rows only

$row = Option::query()->forOwner($user)->where('key', 'theme')->first();

$row->owner;         // the owning model (null for a global row)
$row->owner_scope;   // 'global', or a hash of owner type + id (set on every save)
$row->meta;          // Collection|null
```

## Vlastný model

Nasmerujte options.model na vlastnú podtriedu a pridajte vzťahy, scopes či accessory — prechádza ňou každé čítanie, zápis, export aj import:

```php
namespace App\Models;

use RoundlyConsulting\Options\Option;

class TenantOption extends Option
{
    // extra relations, scopes or accessors
}

// config/options.php
'model' => App\Models\TenantOption::class,
```

Nenastavený kľúč — chýbajúci, null alebo prázdny — použije model z balíka. Čokoľvek iné musí byť Option alebo jeho podtrieda, inak sa vyhodí InvalidConfigurationException z toolkitu s názvom kľúča — cudzia trieda sa nikdy potichu nenahradí modelom z balíka.

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