---
title: "Databázová schéma a typy kľúčov — Addresses for Laravel | Roundly"
description: "Tabuľka addresses stĺpec po stĺpci a ako key_type určuje polymorfný stĺpec vlastníka pre modely s kľúčmi bigint, UUID alebo ULID."
url: https://roundly-consulting.com/sk/open-source/navody/addresses-for-laravel/databazova-schema
language: sk
---

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

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

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

Migrácia vytvorí jednu tabuľku, addresses. Všetci vlastníci ju zdieľajú cez polymorfnú dvojicu addressable:

```php
$keyType = KeyType::fromConfig('addresses.key_type');

Schema::create('addresses', function (Blueprint $table) use ($keyType): void {
    $table->id();
    $table->morphKey('addressable', $keyType, nullable: false);   // morphs / uuidMorphs / ulidMorphs
    $table->boolean('is_primary')->default(false);
    $table->string('type')->default('default');
    $table->string('name')->nullable();
    $table->string('city')->nullable();
    $table->string('street')->nullable();
    $table->string('postal_code')->nullable();
    $table->string('country_iso')->nullable();
    $table->jsonb('meta')->nullable();
    $table->timestamps();
    $table->softDeletes();
});

$this->onePrimaryPerOwnerAndType();   // PostgreSQL and SQLite: partial unique index
```

| Stĺpec | Typ | Poznámka |
| --- | --- | --- |
| `id` | bigint, autoinkrement | Primárny kľúč — vždy celé číslo, bez ohľadu na key\_type. |
| `addressable_type / addressable_id` | polymorfná dvojica | Vlastník. Typ stĺpca id sa riadi podľa key\_type; spoločný index; nesmie byť null. |
| `is_primary` | boolean | Predvolene false. |
| `type` | string | Predvolene 'default'; ukladá hodnotu AddressType. |
| `name` | string, nullable | Voliteľný názov, napr. HQ. |
| `city, street, postal_code` | string, nullable | Riadky adresy — builder a DTO ich vyžadujú, schéma ich povoľuje ako null. |
| `country_iso` | string, nullable | ISO kód, normalizovaný pri zápise. |
| `meta` | jsonb, nullable | Voľné doplnkové údaje; cast na Collection. |
| `created_at, updated_at` | timestamps | — |
| `deleted_at` | timestamp, nullable | Soft deletes. |

- Stĺpec country\_name neexistuje — názov krajiny sa zisťuje pri čítaní cez váš CountryResolver.
- Najviac jedna živá primárna adresa na vlastníka a typ: akcie balíka povyšujú pod zámkom skupiny vlastník + typ a na PostgreSQL a SQLite migrácia pridá aj čiastočný unikátny index addresses\_one\_primary\_per\_type nad (addressable\_type, addressable\_id, type) s podmienkou is\_primary a deleted\_at is null — mäkko zmazané záznamy miesto neblokujú.
- Migrácia ide len dopredu — nemá metódu down().

## Typy kľúčov vlastníka

key\_type opisuje modely, ktoré vlastnia adresy — nikdy nie samotnú tabuľku addresses, ktorá má vždy autoinkrementálne id. Určuje, aký polymorfný stĺpec migrácia vytvorí:

| key\_type | Stĺpec addressable\_id | Kedy použiť |
| --- | --- | --- |
| `bigint` | unsigned big integer — morphs() | Vlastníci majú autoinkrementálne kľúče. Predvolená hodnota. |
| `uuid` | uuid — uuidMorphs() | Vlastníci používajú HasUuids z Laravelu. |
| `ulid` | char(26) — ulidMorphs() | Vlastníci používajú HasUlids z Laravelu. |

Všetky modely vlastniace adresy musia mať rovnaký typ kľúča. Nastavte ho pred migráciou — neznáma hodnota pri spustení migrácie vyhodí InvalidConfigurationException, ktorá uvedie kľúč aj hodnotu:

```bash
# .env — set before you publish and run the migration
ADDRESSES_KEY_TYPE=uuid
```

```php
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Addresses\Traits\HasAddresses;

class Customer extends Model
{
    use HasAddresses;
    use HasUuids;
}
```

## Prebudovanie tabuľky na SQLite

Na SQLite Laravel mení tabuľku tak, že ju prebuduje — napríklad neskoršou migráciou, ktorá volá ->change() na stĺpci tabuľky addresses alebo v nej pridáva či odstraňuje cudzí alebo primárny kľúč. Pri prebudovaní sa stratí podmienka indexu, takže addresses\_one\_primary\_per\_type sa vráti ako úplný unikátny index nad (addressable\_type, addressable\_id, type) a druhá bežná adresa rovnakého typu pre jedného vlastníka potom zlyhá na UniqueConstraintViolationException — typicky v testoch aplikácie, ktoré bežia na SQLite. Na konci takej migrácie čiastočný index vytvorte znova (ak má vaše pripojenie prefix tabuliek, doplňte ho do oboch názvov):

```php
// at the end of up() in a migration that rebuilds the addresses table on SQLite
if (DB::connection()->getDriverName() === 'sqlite') {
    DB::statement('drop index if exists "addresses_one_primary_per_type"');
    DB::statement('create unique index "addresses_one_primary_per_type" on "addresses" ("addressable_type", "addressable_id", "type") where "is_primary" and "deleted_at" is null');
}
```

PostgreSQL mení stĺpec na mieste a podmienku zachová; na MySQL migrácia tento index vôbec nevytvára.

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