Symfony paso a paso (5) – Más migraciones, modificando entidades

Ya tenemos nuestra primera entidad (Word) creada y mapeada correctamente en la BD pero … ¿y si necesitamos modificar sus propiedades? ¿Tenemos que rehacer todo el proceso? ¿Que pasa con nuestras fixtures?

Modificando entidades

Voy a hacer dos cambios en la entidad Word:

  • Voy a añadir un campo publishedAt, que será de tipo fecha y contendrá la fecha en la que se publicó la palabra. Es decir, la fecha en la esa fué La Palabra del Día. Si todavía no fue publicada este campo estará a NULL. Por tanto este campo debería ser nullable y unique
  • Voy a cambiar el nombre de la propiedad description por definition, que aun que no tiene importancia en cuanto a la funcionalidad me parece más correcto… manías.

Para modificar la entidad editamos el archivo de configuración .yml de la entidad Word: «WWBundle/Resources/config/doctrine/Word.orm.yml» (Recuerda que al crear la entidad yo seleccioné configuración con yml y no con anotaciones).

Añado el campo publishedAt y modifico el nombre de la propiedad description, quedando así el nodo fields:

    fields:
        name:
            type: string
            length: '150'
            unique: true
            groups: ['group1']
        definition:
            type: text
            groups: ['group1']
        publishedAt:
            type: date
            unique: true
            nullable: true 

Con el siguiente comando le pedimos a doctrine que actualice nuestra entidad «Word.php»

bin/console doctrine:generate:entities WWBundle:Word

Aqui vamos a detenernos un momento e inspeccionar los cambios en el archivo Word.php por que tendremos que tocar alguna cosilla a mano.

Una buena forma de ver los ccambios es utilizando git:

git diff

Vamos a fijarnos primero en la nueva propiedad «publishedAt». Vemos que ha creado la propiedad, los getters y setter. Todo en orden.

También vemos que ha creado la propiedad definition, con sus getters y setters pero no ha eliminado la propiedad description ni sus metodos asociados. Yo no he encontrado la forma de que doctrine haga esto por nosotros así que ĺos eliminaré a mano, y de paso reorganizaré un poco el fichero, poniendo todas las propiedades al inicio de la clase … más manías.

Llevando los cambios a la BD

El siguiente cambio seria crear un nuevo archivo de migración que aplique estos cambios sobre nuestra BD. Ya sabemos como hacerlo:

bin/console doctrine:migrations:diff

Si comprobamos el contenido del nuevo archivo de migraciones vemos que en el método up añade la columna published_at y renombra descriptioin por definition. Perfecto! Como ya comentamos, las migraciones se ejecutarán en orden (si es que hay mñas de una) por lo que no tenemos que preocuparnos de modificar la migración anterior cuando queramos recrear la BD completa en otro equipo.

Ya podemos ejecutar nuestra migración:

bin/console doctrine:migrations:migrate

Si ahora revisamos nuesra tabla Word vemos que se ha renombrado la columna description y se ha creado una nueva columna para la fecha.

Por último tengo que actualizar la fixture WordFixture (cambiar el método setDescription() por setDefinition() )

Y ya que estamos editando la fixture voy a modificarla para setearle la fecha de publicación a alguna de las palabras, por ejemplo a las 3 primeras:

        
        for ($i=0; $i<10; $i++){ 
            $word = new Word(); 
            $word->setName('palabra_' . ($i+1));
            $word->setDefinition('Definición de la palabra_' . ($i+1));
            if ($i < 3){ 
                $date = new \DateTime('2017-01-0'. ($i+1)); 
                $word->setPublishedAt($date);
            }
            $manager->persist($word);
        }

Cargamos nuestras fixtures:

bin/console doctrine:fixtures:load

Commit y seguimos

git add .
git commit -m  "Ads published_at property to Word. Rename description property to definition"

En el siguiente post veremos como consultar la BD organizando nuestras consultas con los repositorios de Symfony.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *