Migraciones en Laravel

Si bien en la documentación de Laravel tenemos todo referente a las migraciones, creo que es bueno reforzar un poco sobre estas, ya que han habido algunas dudas al respecto.

¿Que son?

Las migraciones son la forma que tenemos para “versionar” nuestros cambios en la base de datos, es decir acá podemos ir realizando (mediante código php) todos los cambios que necesitemos tanto durante la fase de desarrollo como de mantenimiento de la aplicación.

Gracias a estas vamos a poder crear tablas, agregar, modificar o quitar campos a una tabla o algún otro cambio que deseamos hacer en esta.

Hay un concepto erróneo respecto a que una migración corresponde a 1 tabla o modelo en especifico, pero en si corresponde a cambio en tu base de datos. Por otro lado también es un concepto erróneo de que las migraciones son de uso obligatorio en Laravel, esto no es cierto son completamente opcionales, mas si son recomendables.

Además si el proyecto es desarrollado entre varios programadores será mas sencillo de instalar.

¿Como crear una migración?

Para crear una migración ejecutamos el comando:

Esto creara una nueva migración en la carpeta database/migrations anteponiendo la fecha en que esta fue creada.

También puedes crear 1 migración desde 1 modelo

Con la opción -m o –migration se creara la migración create_users_table

¿Como se define una migración?

Cuando generamos una nueva migración mediante este comando se generan dos métodos principales up y down, con los cuales podremos definir lo que el sistema de migraciones, hará al correr y revertir una migración.

Por ejemplo acá se creara la tabla flights al correr la migración, por el contrario al revertir la migración se borrara la tabla.

¿Cómo podemos organizar nuestras migraciones ?

Cuando tenemos un proyecto mediano a pequeño podemos simplemente dejarla en la raíz , pero en proyectos mas grande podemos separar en carpetas ya sea dentro de database/migrations o en la carpeta que quieras , por ejemplo separando por módulos o por clientes en aplicaciones multitenant.

Para indicar donde se debe crear la migración podemos correr el siguiente comando, donde indicaremos el path en donde se creara la migración.

¿Podemos definir las tablas a usar?

Si podemos, usando las opciones –create y –table. La diferencia de estas es que la primera es para cuando queramos crear una tabla y la segunda cuando queramos hacer un cambio en alguna tabla ya creada.

¿Como correr y revertir migraciones?

Para correr migraciones solo se debe ejecutar el comando:

En producción (y si usas un sistema de integración continua o deploy), seria bueno forzar a ejecutar las migraciones

Otra opción es ejecutar solo las migraciones de 1 carpeta en especifico

Cada vez que corras estos comandos se creara un nuevo registro en la tabla migrations con el nombre de la migración. Otra opcion es –pretend que nos mostrara las queries que se iran corriendo mientras se migra.

Por el contrario si quieres revertir migraciones simplemente debes ejecutar el comando:

Esto revertirá las ultimas migraciones realizadas ejecutando los métodos down de manera descendente (desde el lote mayor hasta el menor), para conseguir esto Laravel registra en la tabla migrations el numero de lote en que se ejecuta cada migración. Si quieres revertir un lote en especifico simplemente debes añadir la opción –step

Acá también se puede definir el path a revertir gracias a la opción –path que ya hemos visto.

Revertir y refrescar migraciones

Si quieres revertir todas tus migraciones, puedes utilizar el comando

Para refrescar tu tabla , revirtiendo y corriendo nuevamente todas tus migraciones, tenemos el comando

Puedes indicar el lote a refrescar con –step

¿Y si debo crear otro tipo de cambio?

Si quieres crear un cambio como crear algún procedimiento almacenado o lo que sea que no este al alcance del sistema de migraciones, puedes hacerlo usando DB

Problemas con las Foreign Key

A veces ocurre que las FK dan problemas al migrar , uno de los casos típicos es que la tabla de la fk no ha sido creada, por ende recuerda llevar un orden al momento de crearlas o simplemente modifica la fecha de estas de manera que se ejecuten en orden, por ejemplo si vas a crear una tabla users con un campo role_id, recuerda tener cargada la tabla de roles.

Otra forma es simplemente deshabilitando las FK en las migraciones

¿Cómo usarlas en producción?

Al momento de desarrollar la app puedes manejar los datos como quieras, pero una vez ya estés en producción y existan datos en las diferentes tablas, no debes revertir ni refrescar migraciones por ningún motivo, sino se borrara todo lo que tenias.

Recuerda que 1 migración, no representa a alguna tabla o modelo, sino que a un cambio, por ende siempre que quieras hacer cambios en producción, ejecuta 1 nueva migración indicando a que corresponde.

Para modificar campos que ya existan, debemos instalar el paquete doctrine/dbal

También si puedes usa alguna herramienta para automatizar esto de manera que al subir cambios a producción se ejecute el comando sin necesidad de que tengas que acceder al servidor.

Nota: En Laravel 5.5 se agregara el nuevo comando migrate:fresh el cual reiniciara tus tablas y ejecutara las migraciones, sin considerar los métodos down de tus migraciones. Si necesitas esta función ahora mismo puedes usar el siguiente paquete: https://github.com/spatie/laravel-migrate-fresh

Comparte este artículo

Entra en la discusión y deja tu comentario

Veces