Typy kľúčov a schéma
Jediná tabuľka credits drží všetky záznamy knihy pohybov všetkých vlastníkov. Jej tvar:
| Stĺpec | Typ | Poznámka |
|---|---|---|
id | bigint / uuid / ulid | Podľa primary_key_type — predvolene autoinkrementálny bigint. |
creditable_type | string | Morph trieda vlastníka. |
creditable_id | bigint / uuid / ulid | Podľa key_type. Indexovaný spolu s creditable_type. |
bucket | string | Predvolene 'default', indexovaný. |
amount | bigInteger | So znamienkom: kladné pripisuje, záporné odpisuje. Pretypované na int. |
description | string, nullable | Voliteľná poznámka pre ľudí. |
meta | json(b), nullable | Ľubovoľný štruktúrovaný kontext, pretypovaný na pole. |
created_at / updated_at | timestamps | created_at určuje zostatky k dátumu. |
deleted_at | soft deletes | Soft-deleted záznamy sa do zostatku už nezapočítavajú. |
Zložený index nad (creditable_type, creditable_id, bucket) obsluhuje každé čítanie zostatku.
Tabuľka credit_locks
Tá istá migrácia vytvorí credit_locks — jeden malý riadok na vlastníka, ktorý každá zmena zvýši, aby sa súbežné zmeny toho istého vlastníka zoradili za sebou. Drží len počítadlo verzií; jediným zdrojom pravdy ostáva kniha pohybov:
| Stĺpec | Typ | Poznámka |
|---|---|---|
creditable_type | string | Morph trieda vlastníka. Primárny kľúč spolu s creditable_id. |
creditable_id | bigint / uuid / ulid | Podľa key_type — rovnaký typ ako v credits. |
version | unsignedBigInteger | Predvolene 0. Každá zmena ho zvýši; na zostatok sa nikdy nečíta. |
Dva nezávislé typy kľúčov
Dve nastavenia určujú typ dvoch rôznych stĺpcov. Sú nezávislé — používatelia s uuid, ktorí držia kredity pod bigint id tabuľky credits, sú úplne bežná kombinácia:
| Nastavenie | Určuje typ | Voľba |
|---|---|---|
key_type | creditable_id — morph stĺpec, ktorý ukazuje na vaše modely, v credits aj credit_locks | Primárny kľúč vašich modelov s kreditmi: bigint (predvolené), uuid (HasUuids) alebo ulid (HasUlids). |
primary_key_type | id — vlastný kľúč tabuľky credits | Naň ukazujú polymorfné stĺpce iných balíkov. Ponechajte bigint, pokiaľ všetky morph ciele vo vašej aplikácii nezdieľajú jeden typ kľúča. |
Obe sa zafixujú pri prvom spustení migrácie, preto ich nastavte pred publikovaním a migráciou:
# Decide before publishing and running the migration — both are fixed at migrate time.
CREDITS_KEY_TYPE=uuid # your creditable models use HasUuids
CREDITS_PRIMARY_KEY_TYPE=bigint # the credits table's own id — keep the defaultkey_type podľa vašich modelov
key_type musí zodpovedať primárnemu kľúču vašich modelov s kreditmi: pri autoinkrementálnych id ponechajte predvolený bigint, a ak modely používajú HasUuids alebo HasUlids, nastavte uuid alebo ulid:
CREDITS_KEY_TYPE=uuidAk ho pri používateľoch s uuid kľúčmi necháte na bigint, PostgreSQL odmietne hneď prvú zmenu:
SQLSTATE[22P02]: invalid input syntax for type bigint: "01a0e9ca-cf2c-7..."Všetky modely s kreditmi v aplikácii musia zdieľať tento jeden typ kľúča.
Prečo je primary_key_type predvolene bigint
Na Credit polymorfne ukazujú iné balíky a morph stĺpec v Laraveli ($table->morphs('subject')) je unsigned bigint. Na striktnom engine, ako je PostgreSQL, sa doň uuid id kreditu nezmestí:
SQLSTATE[22P02]: invalid input syntax for type bigint: "019f6f33-22b8-737f-a581-849e7cdc517a"SQLite vás na to neupozorní — vďaka typovej afinite potichu uloží reťazec do celočíselného stĺpca, takže zelená sada testov na SQLite tu nič nedokazuje.
Obmedzenie: predpokladá sa, že všetky morph ciele vo vašej aplikácii zdieľajú jeden typ kľúča. Ak nastavíte CREDITS_PRIMARY_KEY_TYPE=uuid, modely na druhej strane vašich polymorfných vzťahov musia mať tiež uuid kľúče a balíky, ktoré tieto stĺpce vlastnia, s tým musia súhlasiť. Zmiešanú aplikáciu — uuid Credit a bigint Comment, na ktoré ukazuje ten istý morph stĺpec — nepodporuje tento balík, rozdelenie morphs()/uuidMorphs() v Laraveli ani nič iné. Zvoľte jeden typ kľúča pre celú aplikáciu.
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 kryptomienOdoslaní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.