Creación de Entidades y Migraciones en Symfony
Clase 7 de 17 • Curso de Symfony Framework
Creando las entidades
Lo primero que debemos hacer es escribir la configuración básica que necesitaremos para que nuestra aplicación pueda interactuar con una base de datos.
Abre el archivo .env en tu editor favorito.
Te encontrarás con algo como:
Nota que hay una línea donde figuran los datos para conectarse a una base de datos (DATABASE_URL=...).
Reemplaza esa línea por:
DATABASE_URL=mysql://homestead:homestead@127.0.0.1:3396/homestead?serverVersion=5.7
Para continuar vamos a trabajar desde adentro de la máquina virtual.
Vamos a iniciarla con:
vagrant up
Y luego:
vagrant ssh cd code
Y aquí comienza la magia :)
En la clase anterior aprendiste cómo interactuar con el intérprete de comandos de Symfony (usarlo es una palabra un poco fuerte aún).
Veamos ahora un uso muy importante: vamos a crear nuestra primera entidad.
Para ello utiliza el comando
php bin/console make:entity
Lo que viene a continuación es una serie de preguntas que te realizará Symfony para ayudarte a crear el modelo de datos.
Vamos a repasar el modelo de datos que habíamos visto en la clase 2.
La primera entidad que vamos a crear será el oferente:
Ahora veamos qué es exactamente lo que hizo el framework.
Si lees con atención verás que se actualizó el archivo src/Entity/Company.php.
Al abrirlo encontrarás algo como esto:
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="App\Repository\CompanyRepository") */ class Company { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string", length=255) */ private $name; /** * @ORM\Column(type="string", length=255) */ private $email; public function getId(): ?int { return $this->id; } public function getName(): ?string { return $this->name; } public function setName(string $name): self { $this->name = $name; return $this; } public function getEmail(): ?string { return $this->email; } public function setEmail(string $email): self { $this->email = $email; return $this; } }
Potente, ¿cierto? jeje… y esto recién empieza :)
Nota como se utiliza muy extensamente la @ dentro de los comentarios.
Esto no es para nada accidental. Se trata de una herramienta llamada annotations.
Mediante ellos es posible dar indicaciones a otras herramientas.
En nuestro caso, mucho de la configuración de nuestro proyecto estará escrita de este modo.
Por ejemplo, si te fijas la definición de la propiedad $name:
/** * @ORM\Column(type="string", length=255) */ private $name;
Verás que el tipo de datos y la longitud están especificadas aquí.
Esta información vendrá muy bien pronto, confía en mí :)
Te dejo de tarea armar el resto de las entidades.
¡Excelente! Todo esto está genial, pero… ¿dónde se guardará toda esta información?
La base de datos sigue intacta… falta algo, ¿cierto?
Cierto.
Para que todo esto tenga sentido necesitamos crear la estructura que mapee nuestras clases a la base de datos.
Tenemos dos opciones para ello:
Un comando que genera la estructura de la base de datos desde 0:
php bin/console doctrine:schema:create
O bien un comando que genere una migración (que luego tendremos que ejecutar):
php bin/console make:migration
Ambos darán el mismo resultado (en este contexto), sin embargo, es una buena práctica realizar todas las operaciones de modificación de la base de datos a través de migraciones, de esa forma es muy simple reconstruir todo en caso de ser necesario, por ejemplo, al pasárselo a otro desarrollador.
Si abres el archivo generado (lo encontrarás dentro del directorio src/Migrations/) verás el código generado para crear la base de datos.
Una vez hayas terminado de definir todas las entidades debes impactar esos cambios en la base de datos. Para ello puedes usar el comando php bin/console doctrine:migrations:migrate.
El intérprete te preguntará si confirmas impactar los cambios (ya que potencialmente podrían destruir datos) y, una vez lo hayas hecho, te mostrará las sentencias SQL a medida que las ejecuta.
Al finalizar podrás ver cómo quedó tu base de datos ingresando a la consola de MySQL escribiendo
mysql use homestead show tables
Lo interesante de usar las migraciones es que podrás ir realizando cambios incrementales, de modo que, a medida que avances en la comprensión del problema, irás dando más y más detalles a la definición de tu modelo de datos y, mediante este mecanismo, podrás evolucionar tu base de datos consecuentemente.
En el caso de la entidad Offer encontrarás que tiene una propiedad que refiere a otra entidad: el owner (La compañía a la que pertenece la oferta).
Para estos casos Doctrine dispone de una sintaxis particular y escribirla a través del comando make de Symfony es bastante fácil.
El tipo de datos del campo owner debes definirlo como relation:
El tipo de relación es ManyToOne de modo que una oferta se relaciona con una empresa y una empresa puede tener muchas ofertas.
Cuando hayas terminado de armar la entidad Offer no olvides ejecutar el comando php bin/console make:migration para crear la nueva migración y php bin/console doctrine:migrations:migrate para actualizar tu base de datos.
En la próxima clase desarrollaremos nuestras primeras pantallas, ¡no te la pierdas!