Het verschil tussen `morphtomany` en` morphedbymany` in laravel polymorfe veel-tot-veel relaties ligt voornamelijk in hun rol in de relatie en hoe de databasestructuur hen ondersteunt.
Databasestructuur in polymorfe veel-op-veel-many
Polymorfe veel-op-veel relaties omvatten drie hoofdtabellen:
- Twee modeltabellen (bijv. `Posts` en` tags`))
- Eén tussenliggende draaitabel (bijv. `Taggables`)
De draaitabel bevat ten minste drie kolommen:
- `tag_id` (de ID van het gerelateerde model, bijvoorbeeld tag)
- `taggable_id` (de ID van het model dat gerelateerd is aan de tag, bijvoorbeeld post of video)
- `taggable_type` (de klassennaam of het type van het gerelateerde model, bijvoorbeeld` app \ modellen \ post` of `app \ modellen \ video`))
Met deze structuur kan een enkele pivot -tabel meerdere verschillende modellen relateren aan een gemeenschappelijk model (in dit geval tags) zonder afzonderlijke pivottabellen nodig te hebben voor elke modelcombinatie [5] [9].
Rol van `Morphtomany`
- Gebruikt op het model dat "bezit" of "de polymorfe relatie heeft.
- Definieert de relatie vanuit het perspectief van het model dat gerelateerd is aan vele andere modellen.
- In een `post` -model bijvoorbeeld gebruikt de methode` tags () `` morphtomany 'om alle tags die aan dat bericht zijn gekoppeld te krijgen.
- Deze methode specificeert het gerelateerde model en de "morph -naam" (bijv. `'Taggable'`), die overeenkomt met de pivot -tabel kolommen (` taggable_id` en `taggable_type`).
- Het vraagt de pivot -tabelfiltering door de ID en het type van het huidige model om gerelateerde modellen te vinden [5] [9].
Rol van `MorphedByMany`
- Gebruikt op het model dat het doelwit is van de polymorfe relatie.
-Definieert de omgekeerde kant van de polymorfe veel-op-veel-relatie.
- Bijvoorbeeld, in het `tag` -model, methoden zoals` berichten () `of` video's () `gebruik` MorphedByMany` om alle berichten of video's aan die tag te krijgen.
- Het specificeert de gerelateerde modelklasse en dezelfde morph -naam die wordt gebruikt in `morphtomany`.
- Deze methode vraagt de pivot -tabelfiltering door het type en de ID van het gerelateerde model om alle modellen van dat type te vinden dat is gekoppeld aan het huidige model (tag) [5] [9].
Samenvatting van verschillen in databasevoorwaarden
- `Morphtomany` wordt aangeroepen op het model dat gerelateerd is aan vele anderen, en het gebruikt de pivot -tabel kolommen` taggable_id` en `taggable_type` om records te filteren waar de` taggable_type` overeenkomt met de klasse van het huidige model.
- `MorphedBymany` wordt opgeroepen op het model dat gerelateerd is aan (het omgekeerde), en het gebruikt de pivot -tabel om alle modellen van een specifiek type te vinden dat terugtreedt op het huidige model.
Beide methoden gebruiken dezelfde draaitabel maar verschillen in de richting van de relatie die ze vertegenwoordigen. De pivot -tabel blijft hetzelfde, met kolommen voor de ID en het type van het gerelateerde model, waardoor meerdere modelsypen polymorfisch kunnen worden gekoppeld via een enkele tabel.
In essentie definieert `Morphtomany` de relatie van de modelzijde" ouder "of" bezitten ", terwijl` MorphedbyMany` de omgekeerde relatie definieert van de "gerelateerde" modelzijde, beide afhankelijk van dezelfde polymorfe draaitafelstructuur [5] [9] [1].
Citaten:
[1] https://laracasts.com/discuss/channels/laravel/difference-tween-andard-polymorphic-many-to-any-polymorf
[2] https://www.sitepoint.com/eloquents-polymorfe-relaties- explained/
[3] https://laraveldaily.com/post/laravel-polymorfic-many-to-many-get-all-gerelateerd-records
[4] https://laracasts.com/discuss/channels/eloquent/polymorfic-many-to-many-relation-to-multiple-models
[5] https://laravel.com/docs/11.x/eloquent-relationships
[6] https://docs.octobrercms.com/3.x/extend/Database/relations.html
[7] https://simple-code.agency/blog/development/simplify-many-to-many-relationships-with-laravel-polymorfe relaties
[8] https://stackoverflow.com/questions/68073778/laravel-polymorphic-many-to-many-relationship-pivot-table-with-relationship-to-
[9] https://blog.logrocket.com/polymorfe-relationships-laravel/