Skillnaden mellan "Morphtomany" och "MorphedbyMany" i Laravel-polymorfa många-till-många-relationer ligger främst i sina roller i förhållandet och hur databasstrukturen stöder dem.
Databasstruktur i polymorfa många-till-många
Polymorfa många-till-många-relationer involverar tre huvudtabeller:
- Två modelltabeller (t.ex. `inlägg` och` taggar ')
- Ett mellanliggande pivottabell (t.ex. `taggables ')
Pivottabellen innehåller minst tre kolumner:
- `TAG_ID` (ID för den relaterade modellen, t.ex. tagg)
- `Taggable_id` (ID för modellen som är relaterad till taggen, t.ex. inlägg eller video)
- `taggable_type` (klassnamnet eller typen av den relaterade modellen, t.ex.` app \ modeller \ post` eller `app \ modeller \ video ')
Denna struktur gör det möjligt för en enda pivottabell att relatera flera olika modeller till en gemensam modell (taggar i detta fall) utan att behöva separata pivottabeller för varje modellkombination [5] [9].
Roll av `Morphtomany`
- Används på modellen som "äger" eller "har" den polymorfa förhållandet.
- Definierar förhållandet ur perspektivet på modellen som är relaterad till många andra modeller.
- Till exempel, i en "Post" -modell, använder metoden "taggar ()" `morphtomany" för att få alla taggar associerade med det inlägget.
- Denna metod anger den relaterade modellen och "Morph -namnet" (t.ex. `'taggable' '), som motsvarar pivottabellkolumnerna (` taggable_id` och' taggable_type`).
- Det frågar pivottabellfiltreringen med den aktuella modellens ID och typ för att hitta relaterade modeller [5] [9].
Roll av `MorpedbyMany`
- Används på modellen som är målet för det polymorfa förhållandet.
-Definierar den omvända sidan av det polymorfa många-till-många-förhållandet.
- Till exempel, i "tag" -modellen, metoder som `inlägg ()` eller `videor ()` använder `MorpedbyMany` för att få alla inlägg eller videor associerade med den taggen.
- Det anger den relaterade modellklassen och samma Morph -namn som används i "Morphtomany".
- Denna metod frågar pivottabellfiltreringen efter den relaterade modellens typ och ID för att hitta alla modeller av den typen som är associerad med den aktuella modellen (TAG) [5] [9].
Sammanfattning av skillnader i databastermer
- `Morphtomany 'kallas på modellen som är relaterad till många andra, och den använder pivottabellkolumnerna` taggable_id` och `taggable_type` för att filtrera poster där' taggable_type 'matchar den aktuella modellens klass.
- `MorpedbyMany 'kallas på modellen som är relaterad till (den omvända), och den använder pivottabellen för att hitta alla modeller av en specifik typ som relaterar tillbaka till den aktuella modellen.
Båda metoderna använder samma pivottabell men skiljer sig åt i riktningen för förhållandet de representerar. Pivottabellen förblir densamma, med kolumner för den relaterade modellens ID och typ, vilket gör att flera modelltyper kan kopplas polymorfiskt genom en enda tabell.
I huvudsak definierar "Morphtomany" förhållandet från "föräldern" eller "ägande" -modellsidan, medan "MorpedbyMany" definierar det omvända förhållandet från "relaterade" modellsidan, båda förlitar sig på samma polymorfa pivotbordstruktur [5] [9] [1].
Citeringar:
]
[2] https://www.sitepoint.com/eloquents-polymorphic-relationships-explanterat/
[3] https://laraveldaily.com/post/laravel-polymorphic-many-to-many-get-all-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
]
]
[9] https://blog.logrocket.com/polymorphic-relationships-laravel/