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.
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.
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 release on soft delete
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.
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.