Forskjellen mellom `morphtomany` og` morphedbymany` i Laravel polymorfe mange-til-mange-forhold ligger først og fremst i deres roller i forholdet og hvordan databasestrukturen støtter dem.
Databasestruktur i polymorf mange-til-mange
Polymorfe mange-til-mange-forhold involverer tre hovedtabeller:
- To modelltabeller (f.eks. `Posts` og` Tags`)
- Én mellomliggende pivottabell (f.eks. `Taggables`)
Pivottabellen inneholder minst tre kolonner:
- `tag_id` (IDen til den relaterte modellen, f.eks. Tag)
- `Taggable_id` (IDen til modellen som er relatert til taggen, f.eks. Post eller video)
- `Taggable_Type` (klassenavnet eller typen til den relaterte modellen, for eksempel` App \ Models \ Post` eller `App \ Models \ Video`)
Denne strukturen gjør at en enkelt pivottabell kan relatere flere forskjellige modeller til en vanlig modell (tagger i dette tilfellet) uten å trenge separate pivottabeller for hver modellkombinasjon [5] [9].
Rollen til `morphtomany`
- Brukes på modellen som "eier" eller "har" det polymorfe forholdet.
- Definerer forholdet fra perspektivet til modellen som er relatert til mange andre modeller.
- For eksempel bruker i en `Post` -modell,` tags () `-metoden` morphtomany` for å få alle tagger tilknyttet det innlegget.
- Denne metoden spesifiserer den relaterte modellen og "morfnavnet" (f.eks. '' Taggable '), som tilsvarer pivot -tabellkolonnene (`taggable_id` og` taggable_type`).
- Det spør om pivot -tabellfiltrering av den nåværende modellens ID og type for å finne relaterte modeller [5] [9].
Rollen til `MorphedByMany`
- Brukes på modellen som er målet for det polymorfe forholdet.
-Definerer den omvendte siden av det polymorfe mange-til-mange-forholdet.
- For eksempel, i `tag` -modellen, metoder som` innlegg () `eller` videoer () `bruk` morphedbymany` for å få alle innlegg eller videoer tilknyttet den taggen.
- Den spesifiserer den relaterte modellklassen og det samme morf -navnet som ble brukt i `morphtomany`.
- Denne metoden spør om pivot -tabellfiltrering av den relaterte modellens type og ID for å finne alle modeller av den typen assosiert med den nåværende modellen (TAG) [5] [9].
Sammendrag av forskjeller i databasevilkår
- `Morphtomany` kalles på modellen som er relatert til mange andre, og den bruker pivot -tabellkolonnene` taggable_id` og `taggable_type` for å filtrere poster der` taggable_type` samsvarer med den nåværende modellens klasse.
- `MorphedByMany` blir kalt på modellen som er relatert til (det omvendte), og den bruker pivottabellen for å finne alle modeller av en spesifikk type som relaterer seg til den nåværende modellen.
Begge metodene bruker den samme pivottabellen, men avviker i retning av forholdet de representerer. Pivottabellen forblir den samme, med kolonner for den relaterte modellens ID og type, slik at flere modelltyper kan kobles polymorfisk gjennom en enkelt tabell.
I hovedsak definerer `Morphtomany` forholdet fra den" forelderen "eller" å eie "modellsiden, mens` morphedbymany` definerer det omvendte forholdet fra den "relaterte" modellsiden, begge er avhengige av den samme polymorfe pivot -tabellstrukturen [5] [9] [1].
Sitasjoner:
[1] https://laracasts.com/discuss/channels/laravel/difference-between-standard-polymorphic-many-to-many-polymorfic
[2] https://www.sitepoint.com/eloquents-polymorphic-relationships-seplained/
[3] https://laraveldaily.com/post/laravel-polymorphic-many-to-many-get-alling-related-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/simplifying-many-to-many-relationships-with-laravel-polymorphic-relations
[8] https://stackoverflow.com/questions/68073778/laravel-polymorphic-many-to-many-relationship-pivot-table-with-relationship-to-a
[9] https://blog.logrocket.com/polymorphic-relationships-laravel/