---
title: "Databázová schéma a model — Attributes for Laravel | Roundly"
description: "Tabuľky atribútov a revízií, typy kľúčov vlastníka pre modely s UUID a ULID a náhrada modelu Attribute vlastným."
url: https://roundly-consulting.com/sk/open-source/navody/attributes-for-laravel/databazova-schema
language: sk
---

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

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

# Databázová schéma a model

Každý atribút je jeden riadok v jedinej polymorfnej tabuľke — žiadny stĺpec na atribút, žiadna migrácia pre nové pole. Názov tabuľky určuje table:

| Stĺpec | Typ | Poznámka |
| --- | --- | --- |
| `id` | bigint | Autoinkrementálny kľúč. |
| `owner_type, owner_id` | morph, nullable | Vlastniaci model. Typ owner\_id určuje key\_type. |
| `name` | string | Názov atribútu. |
| `value` | text, nullable | Uložený reťazec — JSON pre polia, ISO-8601 v UTC pre dátumy, šifrový text pri šifrovaní. |
| `value_type` | string, nullable | Hodnota AttributeType (predvolene string). |
| `is_encrypted` | boolean | Či value obsahuje šifrový text. |
| `unique_hash` | string(64), nullable, unique | Hash hodnoty jedinečnej definície — pri šifrovaných hodnotách kľúčovaný slepý index; inak null. Pri serializácii modelu je skrytý. |
| `meta` | jsonb, nullable | Metadáta, pretypované na Collection. |
| `created_at, updated_at, deleted_at` | timestamps | Soft deletes — odstránené záznamy sa dajú obnoviť až do prečistenia. |

Tabuľka attributes má unikátny index na (owner\_type, owner\_id, name) — vrátane soft-deleted riadkov — takže vlastník má pre každý názov atribútu práve jeden riadok: pripojenie existujúceho názvu aktualizuje ten istý riadok a pripojenie odpojeného názvu obnoví jeho riadok s novou hodnotou aj metadátami. Vlastný unikátny index má aj unique\_hash, vďaka čomu sú jedinečné definície zárukou databázy (pozrite Jedinečnosť, povinnosť a predvolené hodnoty). Tabuľka attribute\_revisions (history.table) drží voliteľnú auditnú stopu s indexom na rovnakých troch stĺpcoch — pozrite História a auditná stopa.

## Typ kľúča vlastníka

key\_type určuje typ stĺpca owner\_id v oboch tabuľkách, takže atribúty môžu patriť aj modelom s neceločíselnými kľúčmi. Všetky vaše modely vlastníkov musia mať rovnaký typ kľúča:

| key\_type | Stĺpce vlastníka | Použite, keď modely vlastníkov… |
| --- | --- | --- |
| `bigint` | nullableMorphs | používajú predvolené autoinkrementálne kľúče Laravelu (predvolené; akceptuje sa aj alias id) |
| `uuid` | nullableUuidMorphs | používajú HasUuids |
| `ulid` | nullableUlidMorphs | používajú HasUlids |

Nastavte ho pred spustením migrácií:

```bash
ATTRIBUTES_KEY_TYPE=uuid
```

```php
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Attributes\Contracts\HasAttributes as HasAttributesContract;
use RoundlyConsulting\Attributes\Traits\HasAttributes;

class Product extends Model implements HasAttributesContract
{
    use HasAttributes;
    use HasUuids; // pairs with ATTRIBUTES_KEY_TYPE=uuid
}
```

Na veľkosti písmen nezáleží. Nenastavený alebo prázdny kľúč znamená bigint; nerozpoznaná hodnota pri spustení migrácií vyhodí InvalidConfigurationException — nič sa nenahrádza.

## Vlastný model atribútu

Nasmerujte attributes.model na vlastnú podtriedu, ak chcete pridať casty, scopy alebo udalosti modelu. Každé čítanie, zápis, scope, príkaz aj Attribute::collect() získava model cez tento kľúč:

```php
// app/Models/CustomAttribute.php
namespace App\Models;

use RoundlyConsulting\Attributes\Models\Attribute;

class CustomAttribute extends Attribute
{
    protected static function booted(): void
    {
        parent::booted(); // keeps the package's unique-slot and definition hooks

        static::saved(function (self $attribute): void {
            // host-side model events, casts or scopes
        });
    }
}

// config/attributes.php
'model' => App\Models\CustomAttribute::class,
```

Trieda musí byť RoundlyConsulting\\Attributes\\Models\\Attribute alebo jej podtrieda — čokoľvek iné vyhodí InvalidConfigurationException z toolkitu s názvom kľúča; cudzia trieda sa nikdy potichu nenahradí modelom z balíka. Podtrieda dedí vyhľadanie tabuľky z attributes.table, takže $table nenastavujete. Ak prepisuje booted(), zavolajte najprv parent::booted(): model z balíka cez ňu uvoľňuje jedinečnú hodnotu soft-deleted riadku, pri obnovení ju znova obsadí a uplatňuje definíciu na hodnotu nastavenú skôr než jej názov a vlastník.

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