Diferența dintre `Morftomanie` și` MorphedByMany` în relațiile din Laravel Polymorfic, mulți la mulți, se află în primul rând în rolurile lor în relație și modul în care le susține structura bazei de date.
Structura bazei de date în polimorf multor-la-many
Relațiile polimorfe de la multe la mulți implică trei tabele principale:
- Două tabele de model (de exemplu, `postări` și` etichete`)
- Un tabel de pivot intermediar (de exemplu, `taggables`)
Tabelul pivot conține cel puțin trei coloane:
- `tag_id` (ID -ul modelului aferent, de exemplu, TAG)
- `taggable_id` (ID -ul modelului care are legătură cu eticheta, de exemplu, postare sau video)
- `taggable_type` (numele clasei sau tipul modelului aferent, de exemplu,` App \ Models \ Post` sau `App \ Models \ Video`)
Această structură permite unui singur tabel pivot să raporteze mai multe modele diferite cu un model comun (etichete în acest caz), fără a avea nevoie de tabele pivot separate pentru fiecare combinație de model [5] [9].
Rolul lui „Morftoman”
- Folosit pe modelul care „deține” sau „are” relația polimorfă.
- Definește relația din perspectiva modelului care este legat de multe alte modele.
- De exemplu, într -un model „Post”, metoda `tags ()` folosește `morphtomany` pentru a obține toate etichetele asociate cu acea postare.
- Această metodă specifică modelul aferent și „numele morph” (de exemplu, `'taggable'`), care corespunde coloanelor tabelului pivot (` taggable_id` și `taggable_type`).
- Împiedică filtrarea tabelului pivot după ID -ul și tipul modelului actual pentru a găsi modele conexe [5] [9].
Rolul lui `Morphedbymany`
- utilizat pe modelul care este ținta relației polimorfe.
-Definește latura inversă a relației polimorfe de la multe la mulți.
- De exemplu, în modelul `tag`, metode precum` postări () `sau` videoclipuri () `Utilizați` morphedbymany` pentru a obține toate postările sau videoclipurile asociate cu această etichetă.
- Specifică clasa de model aferent și același nume morph folosit în `Morphtomany`.
- Această metodă interogă filtrarea tabelului pivot după tipul și ID -ul modelului aferent pentru a găsi toate modelele de tip asociat cu modelul curent (TAG) [5] [9].
Rezumatul diferențelor în termenii bazei de date
- `Morphtomany` este apelat la modelul care are legătură cu multe altele și folosește coloanele de tabel pivot` taggable_id` și `taggable_type` pentru a filtra înregistrările în care` taggable_type` se potrivește clasei modelului actual.
- `MorphedByMany` este apelat la modelul care are legătură cu (invers) și folosește tabelul pivot pentru a găsi toate modelele unui tip specific care se referă la modelul actual.
Ambele metode folosesc același tabel pivot, dar diferă în direcția relației pe care o reprezintă. Tabelul pivot rămâne același, cu coloane pentru ID -ul și tipul modelului aferent, permițând legarea polimorfului mai multor tipuri de modele printr -un singur tabel.
În esență, „Morftomania” definește relația din partea modelului „părinte” sau „deține”, în timp ce „Morphedbymany” definește relația inversă din partea modelului „înrudit”, ambele bazându -se pe aceeași structură de tabel pivot polimorf [5] [9] [1].
Citări:
[1] https://laracasts.com/discuss/channels/laravel/diffence-between-standard-polimorphic-many-to-many-polimorphic
[2] https://www.sitepoint.com/eloquents-polimorphic-relationships-explained/
[3] https://laveldaily.com/post/laravel-polimorphic-many-to-many-get-all-record-records
[4] https://laracasts.com/discuss/channels/eloquent/polymorphic-many-to-many-relation-to-multiple-models
[5] https://laravel.com/docs/11.x/eloquent-relationships
[6] https://docs.octobercms.com/3.x/extend/database/relations.html
[7] https://simple-code.agency/blog/development/simpifyfify-many-to-many-relationships-with-lavel-polimorphic-relations
[8] https://stackoverflow.com/questions/68073778/laravel-polimorphic-Many-to-Many-Relationship-pivot-table-with-relationship-to-a
[9] https://blog.logrocket.com/polimorphic-relationships-laravel/