Cómo definir relaciones Cero-a-Uno con Doctrine

En general cuando uno comienza a estudiar Bases de Datos Relacionales se habla de un tipo de relación Uno-a-Uno que, en la práctica se usa muy poco. Sin embargo las relaciones tipo Cero-a-Uno tienen muchísimo sentido.

Es el caso de que se quiera modelar un sistema donde una entidad es un caso especial de otra (Algo similar al concepto de herencia de POO), como por ejemplo la relación entre personas y actores:

  • Todos los actores son personas
  • No todas las personas son actores

La forma de implementar esto en una base de datos relacional es poner un campo tipo clave foránea en la tabla hija, el cual a su vez tendrá un índice único (Para reforzar la cardinalidad de la relación).

En el caso del ORM Doctrine, todo esto parte de la definición de la clase Entity.

Pongo un ejemplo de un proyecto en el que trabajé: hay una clase User (De FOSUserBundle) y una clase Taller. Cada taller tiene un responsable, pero no todos los usuarios son responsables de algún taller.

En la clase User está este código

/**
 * @var Taller
 * @ORM\OneToOne(targetEntity="AppBundle\Entity\Taller",mappedBy="responsable")
 */
protected $taller;

Y en la clase Taller este:

/**
 * @var User
 * @ORM\OneToOne(targetEntity="AppBundle\Entity\User", inversedBy="taller")
 */
 private $responsable;

Como podés observar, ambas clases tienen una referencia a la otra, pero en la base de datos, sólo la tabla Taller tiene una referencia a User.

Esto se debe a cómo están escritas las definiciones del vínculo OneToOne.

Más específicamente, se debe a qué clase tiene el mappedBy y el inversedBy: El lado 1 de la relación (es decir, la entidad que siempre existirá) es el que debe llevar inversedBy.

Si bien este tipo de relaciones no son lo más común, ciertamente viene bien conocerlas y la posibilidad de definirlas usando las herramientas de Doctrine ayuda mucho.

¿Alguna duda? ¡Dejala en un comentario!

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a afinar sus habilidades técnicas y avanzar en sus carreras

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.