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

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ĺpecTypPoznámka
idbigint, autoinkrementálnePrimárny kľúč.
owner_type / owner_idnullable morph (podľa key_type)Oba null = globálna hodnota; inak model, ktorému hodnota patrí.
owner_scopestring(32)global alebo hash typu a id vlastníka. Model ho vyplní pri každom uložení; spolu s key je unikátny.
keystring, indexovanékey() daného nastavenia.
valuetext, nullableSurový uložený reťazec — hodnota serializovaná cez svoj cast, pri šifrovaných nastaveniach zašifrovaná. Pri každom čítaní sa pretypuje späť.
metajsonb, nullableĽubovoľné metadáta, na modeli pretypované na Collection.
created_at / updated_attimestamps—
deleted_atsoft deletesforget() 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_typeStĺpce vlastníkaPoužite, keď vaši vlastníci…
bigintnullableMorphspoužívajú predvolené autoinkrementálne kľúče Laravelu (predvolené)
uuidnullableUuidMorphspoužívajú HasUuids
ulidnullableUlidMorphspouží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|null

Vlastný 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 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.