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

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ĺpecTypPoznámka
idbigint / uuid / ulidPodľa primary_key_type — predvolene autoinkrementálny bigint.
creditable_typestringMorph trieda vlastníka.
creditable_idbigint / uuid / ulidPodľa key_type. Indexovaný spolu s creditable_type.
bucketstringPredvolene 'default', indexovaný.
amountbigIntegerSo znamienkom: kladné pripisuje, záporné odpisuje. Pretypované na int.
descriptionstring, nullableVoliteľná poznámka pre ľudí.
metajson(b), nullableĽubovoľný štruktúrovaný kontext, pretypovaný na pole.
created_at / updated_attimestampscreated_at určuje zostatky k dátumu.
deleted_atsoft deletesSoft-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ĺpecTypPoznámka
creditable_typestringMorph trieda vlastníka. Primárny kľúč spolu s creditable_id.
creditable_idbigint / uuid / ulidPodľa key_type — rovnaký typ ako v credits.
versionunsignedBigIntegerPredvolene 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:

NastavenieUrčuje typVoľba
key_typecreditable_id — morph stĺpec, ktorý ukazuje na vaše modely, v credits aj credit_locksPrimárny kľúč vašich modelov s kreditmi: bigint (predvolené), uuid (HasUuids) alebo ulid (HasUlids).
primary_key_typeid — vlastný kľúč tabuľky creditsNaň 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 default

key_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=uuid

Ak 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 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.