Uno a muchos unidireccional en Doctrine

Uno a muchos unidireccional en Doctrine 2

En este tutorial vamos a ver cómo podemos establecer relaciones de uno a muchos unidireccional con tabla pivote en Doctrine 2, este tipo de relaciones son muy importantes ya que nos permiten relacionar datos utilizando una tabla pivote.

Para este ejemplo vamos a trabajar con dos entidades basándonos en la documentación de Doctrine, la entidad User y la entidad Phonenumber, la relación entre ambas será que un usuario puede tener muchos teléfonos pero un teléfono sólo puede pertenecer a un usuario, para ello la única condición es que en la tabla pivote, el campo que hace de fk para el teléfono sea unique, es decir, no permita ese valor más de una vez.

Hacer eso con Doctrine es muy sencillo ya que sólo necesitamos escribir una pequeña anotación a la hora de establecer la relación en la entidad y el trabajo estará hecho.

Si tienes dudas sobre Doctrine a continuación te dejo una serie de tutoriales del blog.

Relaciones uno a muchos unidireccional en Doctrine

Lo primero que debemos definir es la entidad User, para ello simplemente debemos crear un archivo con el siguiente código que pasamos a explicar.


Lo más importante aquí es ver cómo establecemos la relación sobre la propiedad phonenumbers con la siguiente anotación.


Importante es ver que utilizamos @ManyToMany y no @OneToMany contra la entidad Phonenumber, otro punto muy importante es la última linea donde utilizamos unique=true contra el campo phonenumber_id de la tabla pivote users_phonenumbers, esta tabla será generada de forma automática sin necesidad de hacer nada más, al utilizar la notación @JoinTable Doctrine se encarga de ello.

También es importante fijarnos en el constructor de la clase donde inicializamos la propiedad $phonenumbers a una nueva instancia de ArrayCollection, esta clase nos permitirá realizar todas las operaciones sobre la entidad Phonenumber desde la entidad User sin esfuerzo.

Ahora debemos definir la entidad Phonenumber, realmente esta entidad no tiene nada especial ya que todo el trabajo ha sido realizado en la entidad User, crea el archivo Phonenumber.php y añade el siguiente código.


Llegados a este punto ya estamos en condiciones de trabajar con nuestras entidades, pero poco podemos hacer si queremos trabajar con la tabla intermedia, para ello debemos modificar un poco la entidad User para hacer uso de la clase ArrayCollection, simplemente añade los siguientes métodos al final de la entidad.


De esta forma Doctrine ya sabe que debe hacer en cada caso, gracias a la clase ArrayCollection podemos relaciones teléfonos, eliminar un teléfono, obtener todos los teléfonos y eliminar todos los teléfonos de un usuario, así de sencillo.

Para crear nuestras tablas ejecuta el siguiente comando, si quieres crear el esquema.


Si quieres actualizar el esquema.


Ahora tendremos el siguiente esquema en nuestra base de datos.

doctrine-one-to-many-unidirectional

Crear un usuario con un teléfono asociado es muy sencillo, el siguiente código funciona.


Eso habrá creado un nuevo nuevo registro en la tabla users, otro en la tabla phonumbers y una relación en la tabla users_phonenumbers con la pk de cada tabla, en este caso 1, 1.

Crear un teléfono y asociarlo a un usuario.


Simplemente creamos un nuevo teléfono, lo persistimos, lo relacionamos al usuario y ejecutamos la transacción con flush.

Para obtener todos los teléfonos de un usuario sólo debemos escribir el siguiente código, Doctrine se encarga de proporcionar los datos gracias a las relaciones.


Cómo puedes ver accedemos al metodo getNo() de la entidad Phonenumber gracias a ArrayCollection y la relación establecida con Doctrine en la entidad User.

Eliminar un teléfono que haya sido relacionado a un usuario también es muy sencillo.


También podemos eliminar un teléfono, pero al ser la relación unidireccional y manejada desde la entidad User no podemos hacer nada desde la entidad Phonenumber, el requisito para eliminar un teléfono es que primero haya sido eliminado de la tabla users_phonenumbers ya que existe una fk.


Finalmente sólo nos queda eliminar todos los teléfonos relacionados a un usuario, para ello simplemente debemos ejecutar el siguiente código.


Así de sencillo es crear una relación de uno a muchos unidireccional en doctrine, espero que te haya parecido interesante el tutorial, en breve seguiremos viendo más cosas sobre Doctrine ya que es una herramienta muy importante para cualquier programador web.

Añade un comentario

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

Aviso de cookies
Descuentos de hasta el 50% por el Black Friday en CursosdesarrollowebAcceder ahora
+ +