NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Addresses for Laravel

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:

$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ĺpecTypPoznámka
idbigint, autoinkrementPrimárny kľúč — vždy celé číslo, bez ohľadu na key_type.
addressable_type / addressable_idpolymorfná dvojicaVlastník. Typ stĺpca id sa riadi podľa key_type; spoločný index; nesmie byť null.
is_primarybooleanPredvolene false.
typestringPredvolene 'default'; ukladá hodnotu AddressType.
namestring, nullableVoliteľný názov, napr. HQ.
city, street, postal_codestring, nullableRiadky adresy — builder a DTO ich vyžadujú, schéma ich povoľuje ako null.
country_isostring, nullableISO kód, normalizovaný pri zápise.
metajsonb, nullableVoľné doplnkové údaje; cast na Collection.
created_at, updated_attimestamps—
deleted_attimestamp, nullableSoft 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_typeStĺpec addressable_idKedy použiť
bigintunsigned big integer — morphs()Vlastníci majú autoinkrementálne kľúče. Predvolená hodnota.
uuiduuid — uuidMorphs()Vlastníci používajú HasUuids z Laravelu.
ulidchar(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:

# .env — set before you publish and run the migration
ADDRESSES_KEY_TYPE=uuid
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):

// 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

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

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.