Databázová schéma a model
Každý atribút je jeden riadok v jedinej polymorfnej tabuľke — žiadny stĺpec na atribút, žiadna migrácia pre nové pole. Názov tabuľky určuje table:
| Stĺpec | Typ | Poznámka |
|---|---|---|
id | bigint | Autoinkrementálny kľúč. |
owner_type, owner_id | morph, nullable | Vlastniaci model. Typ owner_id určuje key_type. |
name | string | Názov atribútu. |
value | text, nullable | Uložený reťazec — JSON pre polia, ISO-8601 v UTC pre dátumy, šifrový text pri šifrovaní. |
value_type | string, nullable | Hodnota AttributeType (predvolene string). |
is_encrypted | boolean | Či value obsahuje šifrový text. |
unique_hash | string(64), nullable, unique | Hash hodnoty jedinečnej definície — pri šifrovaných hodnotách kľúčovaný slepý index; inak null. Pri serializácii modelu je skrytý. |
meta | jsonb, nullable | Metadáta, pretypované na Collection. |
created_at, updated_at, deleted_at | timestamps | Soft deletes — odstránené záznamy sa dajú obnoviť až do prečistenia. |
Tabuľka attributes má unikátny index na (owner_type, owner_id, name) — vrátane soft-deleted riadkov — takže vlastník má pre každý názov atribútu práve jeden riadok: pripojenie existujúceho názvu aktualizuje ten istý riadok a pripojenie odpojeného názvu obnoví jeho riadok s novou hodnotou aj metadátami. Vlastný unikátny index má aj unique_hash, vďaka čomu sú jedinečné definície zárukou databázy (pozrite Jedinečnosť, povinnosť a predvolené hodnoty). Tabuľka attribute_revisions (history.table) drží voliteľnú auditnú stopu s indexom na rovnakých troch stĺpcoch — pozrite História a auditná stopa. Migrácia update_attribute_revisions_add_actor do nej pridá nullable indexovaný morph actor (actor_type, actor_id) s typom podľa actor_key_type, ktorý zaznamenáva autora každej zmeny.
Typ kľúča vlastníka
key_type určuje typ stĺpca owner_id v oboch tabuľkách, takže atribúty môžu patriť aj modelom s neceločíselnými kľúčmi. Všetky vaše modely vlastníkov musia mať rovnaký typ kľúča:
| key_type | Stĺpce vlastníka | Použite, keď modely vlastníkov… |
|---|---|---|
bigint | nullableMorphs | používajú predvolené autoinkrementálne kľúče Laravelu (predvolené; akceptuje sa aj alias id) |
uuid | nullableUuidMorphs | používajú HasUuids |
ulid | nullableUlidMorphs | používajú HasUlids |
Nastavte ho pred spustením migrácií:
ATTRIBUTES_KEY_TYPE=uuiduse Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Attributes\Contracts\HasAttributes as HasAttributesContract;
use RoundlyConsulting\Attributes\Traits\HasAttributes;
class Product extends Model implements HasAttributesContract
{
use HasAttributes;
use HasUuids; // pairs with ATTRIBUTES_KEY_TYPE=uuid
}Na veľkosti písmen nezáleží. Nenastavený alebo prázdny kľúč znamená bigint; nerozpoznaná hodnota pri spustení migrácií vyhodí InvalidConfigurationException — nič sa nenahrádza. actor_key_type (ATTRIBUTES_ACTOR_KEY_TYPE) prijíma rovnaké hodnoty pre stĺpce actor v revíziách, nezávisle — nastavte ho podľa modelu používateľa ešte pred spustením migrácie actor.
Vlastný model atribútu
Nasmerujte attributes.model na vlastnú podtriedu, ak chcete pridať casty, scopy alebo udalosti modelu. Každé čítanie, zápis, scope, príkaz aj Attribute::collect() získava model cez tento kľúč:
// app/Models/CustomAttribute.php
namespace App\Models;
use RoundlyConsulting\Attributes\Models\Attribute;
class CustomAttribute extends Attribute
{
protected static function booted(): void
{
parent::booted(); // keeps the package's unique-slot and definition hooks
static::saved(function (self $attribute): void {
// host-side model events, casts or scopes
});
}
}
// config/attributes.php
'model' => App\Models\CustomAttribute::class,Trieda musí byť RoundlyConsulting\Attributes\Models\Attribute alebo jej podtrieda — čokoľvek iné vyhodí InvalidConfigurationException z toolkitu s názvom kľúča; cudzia trieda sa nikdy potichu nenahradí modelom z balíka. Podtrieda dedí vyhľadanie tabuľky z attributes.table, takže $table nenastavujete. Ak prepisuje booted(), zavolajte najprv parent::booted(): model z balíka cez ňu uvoľňuje jedinečnú hodnotu soft-deleted riadku, pri obnovení ju znova obsadí a uplatňuje definíciu na hodnotu nastavenú skôr než jej názov a vlastník.
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.