Saltar al contenido

¿Qué son las migraciones en Laravel?

Las migraciones en Laravel son una forma de control de versiones para tu base de datos. Te permiten sincronizar de manera ordenada los cambios en la estructura de las tablas (creación, modificación, eliminación) con el historial de tu proyecto. Gracias a esto, varios desarrolladores pueden trabajar sobre la misma base de datos sin generar conflictos y sin necesidad de compartir manualmente archivos SQL.

Ventajas principales:

  • Facilitan el despliegue de cambios en producción.

  • Permiten mantener un historial ordenado de modificaciones.

  • Hacen que la colaboración entre equipos sea más fluida.

  • Evitan tener que crear y compartir manualmente scripts de actualización de la base de datos.


Configuración inicial de migraciones en Laravel 11

Por defecto, Laravel 11 (al igual que versiones anteriores de Laravel) incluye un conjunto básico de migraciones dentro de la carpeta database/migrations. Cada archivo de migración se nombra siguiendo la convención de fecha y hora, por ejemplo: 0001_01_01_000000_create_users_table.php.

Dentro de estas migraciones por defecto, encontrarás:

  • users_table.php: crea la tabla users, password_reset_tokens y sessions.

  • cache_table.php: crea la tabla cache y cache_locks.

  • jobs_table.php: crea la tabla jobs, job_batches y failed_jobs.

Si es la primera vez que lanzas las migraciones, asegúrate de configurar la conexión a la base de datos en el archivo .env:

Después, en tu terminal, ejecuta:

php artisan migrate

Este comando creará las tablas en la base de datos configurada.


Crear nuevas migraciones

Para crear una nueva migración, utilizamos el comando:

php artisan make:migration create_posts_table

Este comando creará un archivo de migración nuevo en la carpeta database/migrations/ con un nombre como:
2024_12_26_123456_create_posts_table.php.

Un ejemplo de migración básica para la tabla posts podría ser:

  • El método up() describe lo que sucede cuando aplicamos la migración.

  • El método down() describe lo que sucede cuando revertimos (o hacemos rollback) la migración.


Tipos de columnas y opciones comunes

Laravel proporciona un (Fluent) constructor de esquemas que hace fácil definir los tipos de columnas y sus atributos:

  • string('title', 255): Crea un VARCHAR(255).

  • text('content'): Crea un TEXT.

  • integer('votes'): Crea un INT.

  • boolean('is_published'): Crea un TINYINT(1).

  • date('published_date'): Crea un DATE.

  • foreignId('user_id')->constrained(): Crea una columna user_id como llave foránea apuntando a la tabla users.

  • Y muchos más, consultables en la documentación oficial (ten en cuenta que en Laravel 11 se mantienen estos métodos con las mismas convenciones).

Además, puedes añadir atributos como:

  • nullable(): Permite valores NULL.

  • default('texto por defecto'): Asigna un valor por defecto.

  • unique(): Crea un índice único.

  • index(): Crea un índice básico.

Ejemplo:


Modificando tablas a través de migraciones

1. Añadir columnas a una tabla existente en Laravel

El primer caso es muy necesario en prácticamente todos los proyectos, tener la necesidad de añadir columnas a tablas existentes.

Para añadir una columna a una tabla existente en Laravel debemos hacer uso de migraciones, para ello, primero debes crear una nueva migración usando el comando make:migration.

El comando anterior habrá creado un nuevo archivo de migración en el directorio database/migrations de nuestro proyecto:

Al haber utilizado el flag --table=users al generar nuestra migración, Laravel sabe que queremos interactuar con nuestra tabla users y ha creado ese pequeño código en los métodos up y down con lo que necesitamos.

En este punto sólo nos queda ajustar los métodos up y down para añadir una nueva columna:

  • El método up añadirá la columna status de tipo varchar a la tabla users después de la columna email utilizando por defecto el valor active.

  • El método down eliminará la columna cuando hagamos un rollback.

Para que nuestra columna sea añadida en la tabla de usuarios, debemos ejecutar el siguiente comando en nuestro proyecto:

Si ahora revisas la tabla de usuarios verás que se ha actualizado añadiendo nuestra nueva columna.

Para deshacer este cambio, es decir, que nuestra columna status fuese eliminada de la tabla users, deberíamos hacer un rollback de la siguiente forma:

El comando anterior habrá eliminado la columna status de la tabla users, pero ten cuidado, si lo vuelves a ejecutar, eliminará todo lo que se había creado la última vez que se ejecutó el comando php artisan migrate, y ya no será sólo nuestra nueva columna.

2. Modificar columnas en Laravel usando migraciones

Para modificar una columna existente en una tabla en Laravel usando migraciones, primero debemos crear una nueva migración usando el comando make:migration.

Una vez creada la migración, podemos modificar la columna status haciendo que su longitud sea de 20, en lugar de 255 que es el valor por defecto en MySQL utilizando el método change:

  • El método up cambia la longitud a 20.

  • El método down volverá a dejar la longitud en 255.

3. Eliminar columnas en Laravel usando migraciones

El proceso para eliminar columnas utilizando migraciones en Laravel es el mismo, primero debemos crear una nueva migración usando el comando make:migration.

Una vez tenemos nuestra migración, debemos definir los método up y down, veamos:

  • El método up elimina la columna status.

  • El método down vuelve a crear la columna status, es súper importante que la columna quede en el último estado que tenía.

Migraciones avanzadas

1. Renombrar tablas

php artisan make:migration rename_posts_to_articles --table=posts

Dentro de la migración:

2. Migraciones condicionales (dependiendo del entorno)

Si necesitas aplicar ciertas migraciones sólo en ciertos entornos (por ejemplo, local vs. producción), puedes incluir validaciones dentro de up() o down(). Un ejemplo sencillo:

3. Migraciones en múltiples conexiones

Si tu proyecto utiliza múltiples conexiones a diferentes bases de datos, puedes especificar la conexión en la migración con la propiedad $connection:

De esta manera, la migración creará la tabla event_logs en la conexión mysql_logs.


Uso de Seeders junto a las migraciones

Es muy común querer insertar datos de prueba inmediatamente después de correr una migración. Para ello, se usan los Seeders:

  1. Crea un seeder:

    php artisan make:seeder PostsTableSeeder
  2. En el archivo generado (por defecto en database/seeders), escribe tu lógica de inserción:

  3. Ejecuta el seeder:

    php artisan db:seed --class=PostsTableSeeder

Para un enfoque más escalable, lo ideal es utilizar Model Factories (Laravel Factories) junto a Seeders para generar datos de prueba masivamente.


Rollbacks, refrescar y reiniciar migraciones

Durante el desarrollo, es muy útil revertir los cambios aplicados por una migración. Los comandos principales son:

  • php artisan migrate:rollback: Revierte la última migración.

  • php artisan migrate:rollback --step=2: Revierte las dos últimas migraciones.

  • php artisan migrate:refresh: Revierte todas las migraciones y luego las ejecuta de nuevo.

  • php artisan migrate:fresh: Elimina todas las tablas y ejecuta todas las migraciones desde cero (atención en producción).


Buenas prácticas para las migraciones

  1. Una migración por cambio de esquema
    Mantén las migraciones atómicas y pequeñas para facilitar las revisiones de código y la resolución de conflictos.

  2. No modifiques migraciones ya publicadas
    Una vez que una migración ha sido aplicada en producción, no la modifiques. En su lugar, crea una nueva migración para reflejar el cambio.

  3. Prestar atención a los índices
    La creación de índices y llaves foráneas puede afectar el rendimiento cuando las tablas ya están muy pobladas. Considera ventanas de mantenimiento o estrategias con migraciones down-time free en entornos críticos.

  4. Uso de transacciones
    En algunos sistemas de base de datos (p. ej., PostgreSQL), Laravel permite envolver las migraciones en transacciones (configurando DB::beginTransaction()) para garantizar atomicidad.

  5. Backups antes de migrar
    Especialmente en producción, mantén una política de backups para evitar pérdidas irreversibles de datos.


Integración con la ruta de aprendizaje Laravel 11

Si quieres dominar al completo las migraciones y el resto de herramientas que ofrece Laravel en su versión 11, te recomendamos visitar nuestra Ruta de aprendizaje Laravel 11.
Allí encontrarás cursos, ejercicios prácticos y guías avanzadas para llevar tus proyectos a producción sin complicaciones.


Conclusiones

Las migraciones en Laravel 11 siguen siendo una pieza fundamental para el desarrollo y mantenimiento de aplicaciones. Controlan la evolución de tu base de datos a lo largo del ciclo de vida de tu proyecto, facilitan la colaboración en equipo y evitan conflictos entre ambientes de desarrollo y producción.

Con las buenas prácticas y ejemplos expuestos, ya cuentas con una base sólida para sacar el máximo provecho a las migraciones en Laravel 11. ¡Ahora solo queda que apliques lo aprendido y mantengas tu base de datos organizada!

school Curso completo

Curso Laravel 12
Completo 2026

El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.

access_time 8 horas de contenido
layers 4 tecnologías en 1
update 100% actualizado
code Proyectos prácticos
Ver Curso Laravel 12 arrow_forward

star Incluido en cualquier suscripción

Rutas de aprendizaje

Newsletter

Recibe nuevos cursos, actualizaciones, artículos del blog y promociones en tu correo.