Trait HasAttributes
Pridajte trait HasAttributes a implementujte zodpovedajúci kontrakt na každom modeli, ku ktorému chcete pripájať atribúty:
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;
}Funguje s akýmkoľvek Eloquent modelom — produkty, používatelia, objednávky, tikety. Atribúty sa viažu cez polymorfnú reláciu owner, takže jedna tabuľka slúži všetkým modelom.
Relácia
Uložené riadky sprístupňuje relácia attachedAttributes() typu morph-many. Pozor na názov: attributes() je fluentný writer, nie relácia. Dopyty na reláciu vracajú AttributeCollection s pomocníkmi toKeyValue() a keyByName():
$product->attachedAttributes; // AttributeCollection of Attribute models
$product->attachedAttributes()->where('name', 'color')->first();
Product::query()->with('attachedAttributes')->get(); // eager load for cheap readsMetódy na čítanie
| Metóda | Vracia | Účel |
|---|---|---|
attachedAttributes() | MorphMany | Relácia k uloženým záznamom Attribute. |
getAttachedAttributes() | Collection | Názov → typovaná hodnota pre každý uložený atribút. |
getAttachedAttribute($name) | ?Attribute | Jeden model Attribute alebo null. |
getAttachedAttributeValue($name) | mixed | Typovaná hodnota alebo predvolená hodnota z definície. |
getAttachedAttributeValueAsString($name) | ?string | Hodnota v podobe uloženého reťazca. |
hasAttachedAttribute($name) | bool | Či je atribút prítomný. |
getAttachedAttributeMeta($name) | ?Collection | Metadáta atribútu. |
attr($name) | StoredAttributeValue | Typovaný prístupový objekt s uplatnenými predvolenými hodnotami. |
attributeInt / Float / Bool / Array / Date($name) | ?int … ?Carbon | Čítanie podľa typu. |
history($name = null) | Collection | Zaznamenané revízie, najnovšie prvé. |
attributeHistory($name = null) | MorphMany | Relácia k revíziám. |
Metódy na zápis
| Metóda | To isté ako Attributes::for($model)->… | Účel |
|---|---|---|
attributes() | stage() | Fluentný AttributeWriter na prípravu viacerých atribútov. |
attachAttribute($name, $value = null, $meta = null) | set() | Pripojí alebo aktualizuje jeden atribút, voliteľne s metadátami. |
attachAttributes(array $attributes) | setMany() | Pripojí alebo aktualizuje viacero atribútov z mapy názov → hodnota. |
syncAttributeMeta($name, $meta = null) | meta() | Nahradí metadáta jedného atribútu. |
syncAttributes(array $attributes, $forceDelete = false) | sync() | Zosúladí atribúty presne s danou množinou. |
detachAttribute($name, $forceDelete = false) | forget() | Odstráni jeden atribút. |
detachAttributes(array $names, $forceDelete = false) | forget() | Odstráni viacero atribútov. |
destroyAttributes(array $names, $forceDelete = false) | forget() | Odstráni viacero atribútov (rovnaká cesta ako detachAttributes). |
destroyAttributesExcept(array $names, $forceDelete = false) | forgetExcept() | Odstráni všetky atribúty okrem uvedených. |
validateAttributes() | — (validácia v registri) | Overí prítomnosť povinných atribútov a platnosť hodnôt. |
Zapisovacie metódy sú len skratky, nie iná cesta: každá deleguje na Attributes::for($this), takže ich vidia prepísania v hostiteľskej aplikácii aj Attributes::fake(). Každá zapisovacia metóda vracia model, takže volania môžete reťaziť; každý príznak forceDelete predvolene znamená soft delete. Kontrakt vyžaduje attachedAttributes(), getAttachedAttributes(), getAttachedAttributeValue(), hasAttachedAttribute(), attr() a validateAttributes() — trait poskytuje všetky. Query scopy opisuje sekcia Query scopy.
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.