laravel-migraciones-de-base-de-datos-en-laravel

Migraciones de base de datos en Laravel

  • 3 min

Una migración es una descripción versionada de un cambio en la estructura de la base de datos.

Las Migraciones son como un control de versiones para tu base de datos. Permiten a tu equipo definir y compartir la estructura de la base de datos (tablas y columnas) usando código PHP en lugar de SQL.

¿Por qué usar migraciones?

Imagina que estás trabajando en local y creas la tabla productos.

  • Sin migraciones: Tienes que acordarte de crearla también en el servidor de producción y pasarle el SQL a tus compañeros. Si se te olvida una columna, la web se rompe.
  • Con migraciones: Subes tu código. Tu compañero (o el servidor) ejecuta un comando (php artisan migrate) y Laravel crea las tablas o añade las columnas necesarias automáticamente. Todos tienen siempre la misma base de datos.

Creando una migración

Vamos a pedirle a nuestro asistente Artisan que nos cree el archivo para definir una tabla de productos.

php artisan make:migration create_productos_table
Copied!

Esto genera un archivo en database/migrations con una marca de tiempo (ej: 2023_10_25_000000_create_productos_table.php). La fecha es importante: permite a Laravel saber en qué orden ejecutar los cambios.

Anatomía de una migración (up y down)

Al abrir el archivo, verás dos métodos fundamentales. Tú solo tienes que rellenarlos con lo que quieres que pase.

  • up(): Lo que pasa al avanzar. Aquí creas tablas o añades columnas.
  • down(): Lo que pasa al retroceder (deshacer). Aquí borras lo que creaste en up().

Ejemplo: definir la tabla productos

Laravel utiliza un objeto Blueprint para definir los tipos de datos de forma agnóstica (da igual si usas MySQL, PostgreSQL o SQLite, el código es el mismo).

public function up()
{
    Schema::create('productos', function (Blueprint $table) {
        // ID autoincremental (Primary Key)
        $table->id(); 
        
        // VARCHAR(255)
        $table->string('nombre'); 
        
        // TEXT (para textos largos), nullable permite que esté vacío
        $table->text('descripcion')->nullable(); 
        
        // DECIMAL(8, 2) para dinero
        $table->decimal('precio', 8, 2); 
        
        // BOOLEAN (con valor por defecto false)
        $table->boolean('activo')->default(true);
        
        // Crea automágicamente dos columnas: 'created_at' y 'updated_at'
        $table->timestamps(); 
    });
}

public function down()
{
    // Si deshacemos la migración, borramos la tabla
    Schema::dropIfExists('productos');
}
Copied!

Ejecutando la migración

Hasta ahora solo hemos escrito código. La base de datos sigue vacía. Para aplicar los cambios, ejecutamos:

php artisan migrate
Copied!

Laravel leerá todas las migraciones que no se hayan ejecutado todavía, las traducirá a SQL y las lanzará contra la base de datos. Verás mensajes verdes de éxito.

Si vas a tu gestor de base de datos, ¡verás la tabla productos creada perfectamente!

Viajar en el tiempo: rollback

¿Te has equivocado al crear la tabla? ¿Pusiste mal un nombre? No entres a phpMyAdmin a borrarla. Usa el comando de deshacer:

php artisan migrate:rollback
Copied!

Esto ejecuta el método down() de la última migración (borra la tabla productos). Luego puedes corregir el archivo PHP y volver a hacer migrate.

Modificar tablas existentes

¿Qué pasa si la tabla ya existe y quieres añadir una columna nueva, por ejemplo stock? No edites la migración anterior (porque esa ya se ejecutó). Crea una nueva:

  1. php artisan make:migration add_stock_to_productos_table
  2. En el up(): $table->integer('stock');
  3. En el down(): $table->dropColumn('stock');
  4. php artisan migrate.

Laravel detecta que solo hay un archivo nuevo y ejecuta solo ese cambio.