La diferencia entre `morftomany` y` morphedbymany` en las relaciones polimórficas de Laravel muchos a muchos se encuentra principalmente en sus roles en la relación y cómo la estructura de la base de datos los respalda.
Estructura de la base de datos en Polymórfica muchos a muchos
Las relaciones polimórficas de muchos a muchos involucran tres tablas principales:
- Dos tablas modelo (por ejemplo, `publicaciones` y` etiquetas`)
- Una tabla de pivote intermedio (por ejemplo, `taggables`)
La tabla de pivote contiene al menos tres columnas:
- `tag_id` (la ID del modelo relacionado, por ejemplo, etiqueta)
- `taggable_id` (la identificación del modelo relacionado con la etiqueta, por ejemplo, publicación o video)
- `taggable_type` (el nombre o tipo de clase del modelo relacionado, por ejemplo,` App \ Models \ Post` o `App \ Models \ Video`)
Esta estructura permite que una sola tabla de pivote relacione múltiples modelos diferentes con un modelo común (etiquetas en este caso) sin necesidad de tablas dinámicas separadas para cada combinación de modelo [5] [9].
Papel de `Morphtomany`
- Utilizado en el modelo que "posee" o "tiene" la relación polimórfica.
- Define la relación desde la perspectiva del modelo que está relacionado con muchos otros modelos.
- Por ejemplo, en un modelo `post`, el método` etiquetas () `usa` morftomany` para que todas las etiquetas asociadas con esa publicación.
- Este método especifica el modelo relacionado y el "nombre de morfo" (por ejemplo, `'taggable'`), que corresponde a las columnas de la tabla de pivote (` taggable_id` y `taggable_type`).
- Consulta el filtrado de la tabla de pivote por la ID y el tipo de modelo actual para encontrar modelos relacionados [5] [9].
Papel de `Morphedbymany`
- Utilizado en el modelo que es el objetivo de la relación polimórfica.
-Define el lado inverso de la relación polimórfica de muchos a muchos.
- Por ejemplo, en el modelo `Tag`, métodos como` publicar () `o` videos () `use` morphedbymany` para obtener todas las publicaciones o videos asociados con esa etiqueta.
- Especifica la clase de modelo relacionada y el mismo nombre de morfo utilizado en `morphtomany`.
- Este método consulta el filtrado de la tabla de pivote por el tipo y la ID del modelo relacionado para encontrar todos los modelos de ese tipo asociados con el modelo actual (TAG) [5] [9].
Resumen de las diferencias en los términos de la base de datos
- `Morphtomany` se llama en el modelo relacionado con muchos otros, y utiliza las columnas de la tabla PIVOT` tagGable_id` y `taggable_type` para filtrar registros donde el` taggable_type` coincide con la clase del modelo actual.
- `MorphedbyMany` se llama en el modelo que se está relacionado con (el inverso), y utiliza la tabla de pivote para encontrar todos los modelos de un tipo específico que se relacionan con el modelo actual.
Ambos métodos usan la misma tabla de pivote pero difieren en la dirección de la relación que representan. La tabla de pivote sigue siendo la misma, con columnas para la identificación y tipo de modelo del modelo relacionados, lo que permite que múltiples tipos de modelo se vinculen polimorficamente a través de una sola tabla.
En esencia, `Morftomany` define la relación del lado modelo" padre "o" poseer ", mientras que` MorphedbyBymany` define la relación inversa del lado del modelo "relacionado", ambos dependiendo de la misma estructura de la tabla de pivote polimórficos [5] [9] [1].
Citas:
[1] https://laracasts.com/discuss/channels/laravel/difference-between-standard-polymorphic-many-to-many-polymórfica
[2] https://www.sitePoint.com/eloquents-polymorphic-relationships-explaned/
[3] https://laraveldaily.com/post/laravel-polymorphic-many-to-many-get-alt-relation-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/develovelment/simplify-many-to-many-relationships-with-laravel-polymórficos-relaciones-relaciones
[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/