Las migraciones de la base de datos nos permiten crear diferentes versiones del esquema de la base de datos mientras estamos desarrollando una aplicación.
Esto es muy útil cuando estás trabajando en un equipo y cada programador hace sus cambios en la base de datos, etc, cuando otro programador mezcle el código del compañero podrá lanzar las migraciones que ha generado el compañero y así tener la misma versión de la base de datos de forma fácil.
También cuando desplegamos la web, es decir cuando pasamos la aplicación de desarrollo a producción, en este proceso de deploy se lanzan las migraciones para tener la ultima base de datos en producción.
Veamos como hacer migraciones con Symfony3.
En primer lugar instalamos el bundle DoctrineMigrationBundle con Composer, como sabes Symfony 3 y también el 2 utilizan Composer como gestor de dependencias en PHP.
En nuestro fichero composer.json, en la entrada require añadimos:
"doctrine/doctrine-migrations-bundle": "dev-master"
Ahora lanzamos el comando
composer update
Una vez que se instalen o actualicen todos los paquetes entramos al fichero app/AppKernel.php y añadimos al array bundles la instancia del objeto de las migraciones.
new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(),
Ahora en la consola tenemos disponibles una serie de comandos para hacer nuestras migraciones.
Si queremos generar una migración vacia para meterle lo que queramos podemos usar el comando
php bin/console doctrine:migrations:migrate
En el directorio app/DoctrineMigrations nos ha generado esta clase con un método up que es para cuando se lanza la migración y un down que es para cuando hacemos un rollback revertir los cambios que hace up.
<?php namespace Application\Migrations; use Doctrine\DBAL\Migrations\AbstractMigration; use Doctrine\DBAL\Schema\Schema; /** * Auto-generated Migration: Please modify to your needs! */ class Version20160103192537 extends AbstractMigration { /** * @param Schema $schema */ public function up(Schema $schema) { // this up() migration is auto-generated, please modify it to your needs } /** * @param Schema $schema */ public function down(Schema $schema) { // this down() migration is auto-generated, please modify it to your needs } }
Ahora imagínate que hemos cambiado cosas en nuestras entidades y en nuestra base de datos, podemos lanzar el comando
php bin/console doctrine:migrations:diff
para que doctrine revise los y genere una nueva migración con los cambios que tengamos echos en nuestras entidades.
Por ejemplo yo en una de mis entidades he añadido el campo precio y luego he lanzado el comando diff y me ha generado la migración con estos cambios.
<?php namespace Application\Migrations; use Doctrine\DBAL\Migrations\AbstractMigration; use Doctrine\DBAL\Schema\Schema; /** * Auto-generated Migration: Please modify to your needs! */ class Version20160103195020 extends AbstractMigration { /** * @param Schema $schema */ public function up(Schema $schema) { // this up() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE novedades ADD precio DOUBLE PRECISION NOT NULL'); } /** * @param Schema $schema */ public function down(Schema $schema) { // this down() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE novedades DROP precio'); } }
Ahora para lanzar la entidad y hacer los cambios en la base de datos lanzamos el comando
php bin/console doctrine:migrations:migrate
Con esto ya sabemos usar las migraciones en Symfony3.
Más información:
http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html