This course is still being released! Check back later for more chapters.

Get Notified About this Course!

We will send you messages regarding this course only
and nothing else, we promise.
You can unsubscribe anytime by emailing us at:
privacy@symfonycasts.com
Login to bookmark this video
Buy Access to Course
04.

Migraciones

|

Share this awesome video!

|

Keep on Learning!

With a Subscription, click any sentence in the script to jump to that part of the video!

Login Subscribe

Tenemos una entidad Starship... ¡pero no una tabla starship! ¿La solución? ¡Migraciones de base de datos!

make:migration

Crea nuestra primera migración ejecutando:

symfony console make:migration

¡Éxito! Esto no añadió la tabla real, pero sí creó un nuevo archivo en el directorio migrations/. ¡Vamos a comprobarlo!

Ooh, es una clase PHP en la que el método up() contiene el SQL para crear nuestra tabla. Lo interesante es cómo se creó: Doctrine comparó el estado actual de nuestras entidades con la base de datos y generó el SQL necesario para hacerlas coincidir. ¡Vaya!

34 lines | migrations/Version20241111171351.php
// ... lines 1 - 12
final class Version20241111171351 extends AbstractMigration
{
// ... lines 15 - 19
public function up(Schema $schema): void
// ... line 21
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TABLE starship (id SERIAL NOT NULL, name VARCHAR(255) NOT NULL, class VARCHAR(255) NOT NULL, captain VARCHAR(255) NOT NULL, status VARCHAR(255) NOT NULL, arrived_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))');
$this->addSql('COMMENT ON COLUMN starship.arrived_at IS \'(DC2Type:datetime_immutable)\'');
}
// ... lines 26 - 32
}

También hay un método down()... porque las migraciones pueden invertirse, pero nunca lo he hecho, así que no me preocupa down().

Una cosa a tener en cuenta sobre el SQL: está en el formato de la plataforma de base de datos que estés utilizando. En nuestro caso, SQL específico de Postgres. Si usaras SQLite, verías SQL específico de SQLite.

Si quieres, añade una nota sobre lo que hace esto en getDescription():return 'Add starship table'.

34 lines | migrations/Version20241111171351.php
// ... lines 1 - 12
final class Version20241111171351 extends AbstractMigration
{
public function getDescription(): string
{
return 'Add starship table';
}
// ... lines 19 - 32
}

Comprobar el estado de la migración

Ve al terminal y ejecuta:

symfony console doctrine:migrations:list

La salida es un poco confusa, pero podemos ver nuestra clase de migración y su descripción. El estado es not migrated porque aún no la hemos ejecutado. ¡Vamos a hacerlo!

symfony console doctrine:migrations:migrate

¿Estamos seguros de que queremos continuar? ¡Sí! ¡Lo hemos conseguido! Inténtalo

symfony console doctrine:migrations:list

otra vez. ¡Estado: migrated!

Cómo funcionan las migraciones

Pero, ¿cómo hace Doctrine para saber qué migraciones se han ejecutado? Crea una tabladoctrine_migration_versions, y luego inserta una fila por cada migración una vez ejecutada.

¡Podemos verlo! Ejecuta:

symfony console doctrine:query:sql 'select * from doctrine_migration_versions'

¡Mira esto! ¡Ahí está nuestra clase de migración, cuándo se ejecutó, cuánto tardó y el color favorito de la migración! Vale, esto último no.

¿Significa esto que tenemos nuestra tabla starship? ¡Ejecuta otra consulta SQL sin procesar para averiguarlo!

symfony console doctrine:query:sql 'select * from starship'

La consulta arrojó un conjunto de resultados vacío.

El verde significa bueno, ¿verdad? ¡Sí! Esto nos dice que no hay datos en la tabla starship... ¡pero existe!

Comprobación de la clase de entidad: ✅ Comprobación de la tabla de la base de datos: ✅ ¿Hay datos en la base de datos? ¡Aprendamos a hacerlo a continuación!