Muchos a muchos bidireccional en Doctrine

Muchos a muchos bidireccional en Doctrine

En este tutorial de Doctrine 2 vamos a ver lo sencillo que es establecer una relación de muchos a muchos bidireccional en Doctrine.

Para este ejemplo vamos a trabajar con dos entidades, la entidad Article y la entidad Tag, un tag puede pertenecer a muchos artículos y un artículo puede pertenecer a muchos tags, es decir, puede ser perfectamente una relación de muchos a muchos bidireccional.

Las relaciones de muchos a muchos se identifican porque suele haber una tabla pivote la cual establece la relación entre ambas entidades, en este caso la tabla intermedia será articles_tags y simplemente tendrá los campos article_id y tag_id los cuales serán claves foráneas haciendo referencia a la pk de su respectiva tabla, para entender todo un poco mejor la siguiente imagen ilustra el ejemplo.

many-to-many-bidirectional

Enlaces que te pueden interesar:

Ahora que ya sabemos que vamos a hacer debemos crear las entidades, así que empecemos.

Relación de muchos a muchos bidireccional en Doctrine

Lo primero que vamos a definir es la entidad Article, ésta será la encargada de establecer la relación a través de una tabla intermedia con la entidad Tag, simplemente debemos añadir el siguiente código que pasamos a explicar.


Cómo puedes ver es sencillo, una relación @ManyToMany con la entidad Tag y una tabla intermedia @JoinTable articles_tags, el resto lo hemos visto en tutoriales anteriores, aunque todavía no hemos definido los métodos que nos permiten interactuar con ambas entidades, el esqueleto nos ayuda a entender cómo va a trabajar.

Ahora crea la entidad tag y añade el siguiente código.


Exactamente igual que la entidad Article con la única diferencia que aquí no debemos definir la tabla pivote con la anotación @JoinTable al haberlo hecho en la entidad Article.

Al igual que con la entidad Article aquí faltan los métodos importantes, primero vamos a añadirlos a la entidad Article, estos métodos nos permitirán crear un tag, crear muchos tags, eliminar una relación entre un artículo y un tag desde la entidad Article, así que abre dicha entidad y añade el siguiente código al final de la misma.


Así de sencillo, con el método addTag establecemos la relación entre un tag y un artículo, el método getTags nos devuelve todos los tags de un artículo, el método removeTag elimina un tag relacionado con este artículo y el método removeAllTags elimina todos los registros existentes en la tabla pivote articles_tags que tienen como article_id al id del artículo actual.

Para eliminar un artículo y todas sus relaciones simplemente debemos llamar al método remove del em con la instancia del artículo.

Ahora añade lo siguiente al final de la entidad tag para que tenga la misma funcionalidad que la entidad Article.


Llegados a este punto sólo nos queda utilizar ambas entidades, pero antes recuerda ejecutar los comandos para crear las tablas.

Crear un artículo y un tag y que éstos estén relacionados es tan sencillo como sigue.


Crear un nuevo tag.


Crear un nuevo artículo.


Obtener todos los tags de un artículo.


Obtener todos los artículos de un tag.


Añadir un tag a un artículo existente.


Añadir un nuevo artículo a un tag existente.


Relacionar un artículo y un tag a través de la entidad Article.


Relacionar un artículo y un tag a través de la entidad Tag.


Eliminar la relación entre un artículo y un tag.


Eliminar todas las relaciones de un artículo sin eliminar el artículo.


Eliminar todas las relaciones de un artículo sin eliminar el artículo.


Eliminar un artículo y todas sus relaciones.


Eliminar un tag y todas sus relaciones.


Así de sencillo es definir y utilizar toda la funcionalidad de una relación de muchos a muchos bidireccional en Doctrine, espero que te haya gustado el tutorial.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. ACEPTAR