Diciembre 01, 2016
hjuarez
En este articulo se explicara como hacer relaciones de muchos a uno (ManyToOne) en doctrine Symfony 3.1.
En la entrada anterior Como crear un modelo de datos con doctrine en Symfony 3 se creo una entity llamada blog, y se creo una migración y se plasmo en la base de datos.
Para ejemplificar esta entrada, se creara otra nueva entity llamada Article y relacionarla con la tabla blog, es decir, la tabla blog puede tener muchos articles, pero un article solo puede estar en un registro de la tabla blog.
1. Crear entity Article.
bin/console doctrine:generate:entity
2. Crear una migración de entity Article.
bin/console doctrine:migrations:diff
3. Crear una tabla article con la migración hecha.
bin/console doctrine:migrations:migrate
Antes de realizar las relaciones, veremos como se hicieron las tablas dentro de la base de datos, para hacer una ccomparación al final sobre los cambios.
4. Agregar la relación de ManyToOne en la entity article.
Después de que la entity esta creada y este hecha en la base de datos, abrimos el archivo con la clase entity Article y agregamos un campos mas después del campo id, que haga referencia a la entity Blog.
Se agrega la relación ManyToOne, en targetEntity se hace referencia a la entity que se va a relacionar. Ademas de inversedBy que es la variable que se encuentra en la entity blog que hace un mapeo de toda esa entidad.
Se agrega un JoinColumn, donde en name se escribe el nombre del campo en la tabla article que hace referencia a la tabla blog, en este ejemplo es seria blog_id, referenceColumnName es el id de la tabla blog. Esto se asegura que la relacion sea solo entre esos dos campos de cada tabla.
NOTA: La relación se esta haciendo de tipo annotation, porque asi se declarado al generar la entity, igual se puede hacer en formato php o yaml.
/**
* @ORM\ManyToOne(targetEntity="Blog", inversedBy="articles")
* @ORM\JoinColumn(name="blog_id", referencedColumnName="id", nullable=false)
*/
private $blog;
5 Agregar la relación de OneToMany en la entity Blog.
Se abre el archivo que contiene la entity blog y se agrega una variable que referencie a la entity Article, llamada igual a como se escribió en inverseBy, realizada en el punto anterior.
Se agrega la relación OneToMany, en targetEntity se escribe el nombre de la entity a la que se esta haciendo la relación, en este caso es Article. Después en mappedBy se escribe el nombre de la tabla que esta en la base de datos
/**
* @ORM\OneToMany(targetEntity="Article", mappedBy="blog")
*/
private $articles;
Se agrega un constructor, si este ya existe, solo de introducir la referencia de la variable creada anteriormente.
Este variable se inicializa como un nuevo ArrayCollection(), que es un objeto de tipo ArrayCollection, es como un array que permite mayor flexibilidad en doctrine.
Verificar que se agrega use Doctrine\Common\Collection\ArrayCollection; en la parte superior de la clase.
/**
* Blog constructor.
*/
public function __construct()
{
$this->articles = new ArrayCollection();
}
6. Crear una nueva migración con las relaciones.
bin/console doctrine:migrations:diff
7. Agregar las relaciones en la base de datos.
bin/console doctrine:migrations:migrate
Con esto se crean las relaciones de Muchos a uno (ManyToOne) en doctrine Symfony 3.1
Ahora veremos como quedan las tablas con la relacion hecha.
En la imagen se muestra que el campo blog_id de la tabla article, tiene un MUL en el key, esto es una referencia de un indice no unico que hace doctrine cuando se hace la relacion entre dos campos de diferentes tablas.
El key MUL permite multiples ocrrencias de un valor dentro de una columna.
Espero que esta entrada sea de su agrado.