Databázová schéma a typ kľúča
Všetky hodnoty — globálne aj patriace vlastníkom — ukladá jediná tabuľka options:
Schema::create('options', function (Blueprint $table) use ($keyType): void {
$table->id();
$table->morphKey('owner', $keyType, nullable: true); // owner_type + owner_id
// 'global' or a hash of owner type + id, filled by the model
$table->string('owner_scope', 32);
$table->string('key')->index();
$table->text('value')->nullable();
$table->jsonb('meta')->nullable();
$table->timestamps();
$table->softDeletes();
$table->index(['owner_type', 'owner_id', 'key']);
$table->unique(['owner_scope', 'key']);
});| Stĺpec | Typ | Poznámka |
|---|---|---|
id | bigint, autoinkrementálne | Primárny kľúč. |
owner_type / owner_id | nullable morph (podľa key_type) | Oba null = globálna hodnota; inak model, ktorému hodnota patrí. |
owner_scope | string(32) | global alebo hash typu a id vlastníka. Model ho vyplní pri každom uložení; spolu s key je unikátny. |
key | string, indexované | key() daného nastavenia. |
value | text, nullable | Surový uložený reťazec — hodnota serializovaná cez svoj cast, pri šifrovaných nastaveniach zašifrovaná. Pri každom čítaní sa pretypuje späť. |
meta | jsonb, nullable | Ľubovoľné metadáta, na modeli pretypované na Collection. |
created_at / updated_at | timestamps | — |
deleted_at | soft deletes | forget() riadok soft-zmaže. |
Riadok s prázdnymi owner_type a owner_id je globálna hodnota; každý iný riadok patrí modelu, na ktorý odkazuje. Zložený index nad (owner_type, owner_id, key) z vyhľadania v rámci rozsahu robí jediný indexovaný dopyt.
Unikátny index nad (owner_scope, key) drží v tabuľke najviac jeden riadok na nastavenie a rozsah. Dva requesty, ktoré v tej istej chvíli zapíšu nové nastavenie, ho tak neuložia dvakrát — druhý zápis aktualizuje riadok prvého — a soft-zmazaný riadok zabudnutého nastavenia znova použije najbližší set() alebo import.
Typ kľúča vlastníkov
key_type určuje typ polymorfných stĺpcov vlastníka. Opisuje modely, ktorým hodnoty patria — nikdy nie samotnú tabuľku options, tá má vždy autoinkrementálne id:
| key_type | Stĺpce vlastníka | Použite, keď vaši vlastníci… |
|---|---|---|
bigint | nullableMorphs | používajú predvolené autoinkrementálne kľúče Laravelu (predvolené) |
uuid | nullableUuidMorphs | používajú HasUuids |
ulid | nullableUlidMorphs | používajú HasUlids |
Číta sa pri spustení migrácie, preto ho nastavte vopred. Na veľkosti písmen nezáleží; čokoľvek iné ako bigint, uuid alebo ulid pri spustení migrácie vyhodí InvalidConfigurationException — nič sa nenahrádza.
Model Option
RoundlyConsulting\Options\Option je bežný Eloquent model so soft deletes, factory a vzťahom owner() typu morphTo. Stĺpec value nemá statický cast — každé nastavenie pri čítaní a zápise aplikuje vlastné castAs(). Užitočné členy:
use RoundlyConsulting\Options\Option;
Option::query()->forOwner($user)->get(); // rows owned by $user
Option::query()->forOwner(null)->get(); // global rows only
$row = Option::query()->forOwner($user)->where('key', 'theme')->first();
$row->owner; // the owning model (null for a global row)
$row->owner_scope; // 'global', or a hash of owner type + id (set on every save)
$row->meta; // Collection|nullVlastný model
Nasmerujte options.model na vlastnú podtriedu a pridajte vzťahy, scopes či accessory — prechádza ňou každé čítanie, zápis, export aj import:
namespace App\Models;
use RoundlyConsulting\Options\Option;
class TenantOption extends Option
{
// extra relations, scopes or accessors
}
// config/options.php
'model' => App\Models\TenantOption::class,Nenastavený kľúč — chýbajúci, null alebo prázdny — použije model z balíka. Čokoľvek iné musí byť Option alebo jeho podtrieda, inak sa vyhodí InvalidConfigurationException z toolkitu s názvom kľúča — cudzia trieda sa nikdy potichu nenahradí modelom z balíka.
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.