Označovanie modelov
Štítky modelu zapisujú štyri metódy, rovnako na traite, na handle for() aj na fasáde. Typ je vždy posledný, voliteľný argument:
$live = Tags::type('label')->make('Live')->create();
// A model, a primary key (int), a slug or a name — mixed freely, the type last
$concert->attachTags([$live, 42, 'outdoor', 'Late night'], 'label');
// Unknown names of a free-form type are created on the fly; a curated type never creates
$concert->attachTags('Polka', 'genre'); // TagNotFoundException
// A single type carries one tag: sync replaces it, attach refuses a second one
$concert->syncTags('jazz', 'genre'); // sets the category
$concert->attachTags('rock', 'genre'); // TagLimitExceededException — nothing written
$concert->syncTags(null, 'genre'); // clears it
// Detach is lenient: names that name no tag are ignored
$concert->detachTags(['outdoor', 'no-such-label'], 'label');
$concert->clearTags('label'); // every label
$concert->clearTags(); // every tag of every type- Vstupom je model Tag, primárny kľúč (int — kľúč uuid či ulid odovzdajte cez findMany(), pretože reťazec vždy znamená názov), slug alebo názov — jeden alebo ľubovoľný iterovateľný zoznam.
- attach pridáva. Neznáme názvy voľného typu sa vytvoria v rozsahu modelu; kurátorovaný typ nikdy nevytvára (TagNotFoundException). Prekročenie limitu typu vyhodí TagLimitExceededException a nezapíše nič — aj pri type s jedným štítkom.
- sync nastaví štítky modelu jedného typu presne na zadanú množinu: zvyšné odpojí a chýbajúce pripojí; štítky iných typov nemení. sync(null) alebo sync([]) typ vyprázdni. Bez typu synchronizuje predvolený typ.
- detach je zhovievavý — názvy bez štítku, zmazané štítky a štítky iného rozsahu preskočí — takže je idempotentný.
- clear odoberie všetky štítky jedného typu alebo všetkých typov.
- Každá metóda označovania — na fasáde, handle aj traite — potom zahodí načítaný vzťah tags modelu, takže tagsOf() aj vaše resources vidia zápis.
- Limit sa kontroluje len pre typy, do ktorých volanie pridáva, takže model, ktorý už limit po jeho znížení prekračuje, sa stále môže zmenšiť.
Reťazenie
$concert
->syncTags($jazz, 'genre') // each write returns the model…
->attachTags(['Live', 'Outdoor'], 'label');
Tags::for($concert)
->detach('outdoor', 'label') // …or the handle, which drops the loaded
->attach('Rooftop', 'label') // tags relation after every write
->of('label'); // Live, RooftopČo sa naozaj zmenilo
Ploché metódy fasády vracajú TagChanges — ten istý objekt, ktorý vracia každá akcia:
$changes = Tags::sync($concert, ['live', 'Outdoor', 'Rooftop'], 'label');
$changes->attached; // list<Tag> — put on the model by this call
$changes->detached; // list<Tag> — taken off by this call
$changes->created; // the attached tags this call created for new free-form names
$changes->restored; // the attached tags this call brought back from deleted
$changes->isEmpty(); // true when nothing was attached or detached
$changes->ofType('label');Tagged a Untagged sa spustia len vtedy, keď sa niečo zmenilo, a až po potvrdení transakcie; TagCreated alebo TagRestored sa spustí pre každý štítok, ktorý voľný názov vytvoril alebo vrátil.
Reťazce a predvolený typ
// No type: a string names a tag of tags.default_type ('tag' — flat, free-form, unlimited)
$article->attachTags(['laravel', 'php']);
$article->tagsOf('tag');
// Models and keys carry their own type, so a list may mix types when no type is given
$article->attachTags([$jazz, $live]);
// 'default_type' => null (or blank): every string must name its type
$article->attachTags('laravel'); // UnknownTagTypeException (type_required)Poradie kontrol
Každé attach a sync vyhodnocuje vstup v pevnom poradí, takže to isté volanie zlyhá vždy rovnako — a nič sa nezapíše, kým neprejdú všetky kontroly:
| # | Kontrola | Výnimka |
|---|---|---|
| 1 | Kľúč bez štítku, potom viditeľnosť vstupu: model alebo kľúč štítku z rozsahu, ktorý model nevidí, odpovie presne ako chýbajúci — skôr, než by čokoľvek iné potvrdilo, že existuje. | TagNotFoundException / TagScopeMismatchException |
| 2 | Zmazaný štítok. | TagNotFoundException |
| 3 | Štítok iného typu, než uvádza volanie. | TagTypeMismatchException |
| 4 | Typy, ktoré model smie niesť, z oboch strán: zoznam on() typu a tagTypes() modelu. | TagTypeNotAllowedException |
| 5 | Reťazce: prázdny či pridlhý názov je neplatný; neznámy názov kurátorovaného typu sa nenájde. | InvalidTagException / TagNotFoundException |
| 6 | Limit každého typu, do ktorého volanie pridáva — volanie vyhodí výnimku a nezapíše nič. | TagLimitExceededException |
Čítanie bez N+1
foreach (Concert::with('tags')->get() as $concert) {
echo $concert->tagOf('genre')?->name; // Jazz — filtered in memory
echo $concert->tagsOf('label')->pluck('name')->join(', '); // Live, Outdoor
}
$concert->hasTag('live', 'label'); // a model, a key, a name or a slug
$concert->hasAnyTags(['live', 'free'], 'label');
$concert->hasAllTags(['live', 'outdoor'], 'label');
Tags::for($concert)->all(); // every tag, by position
Tags::for($concert)->one('genre'); // the same as tagOf()tagsOf() a tagOf() pri načítanom vzťahu tags filtrujú v pamäti, inak spustia jeden dotaz — stránka s 25 modelmi a ich štítkami sú teda dva dotazy bez ohľadu na počet štítkov. Čítanie ignoruje priradenia zmazaného štítku.
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.