Skip to content

Capítulo 2.3: Migraciones de la base de datos

Tiempo de estudio: 50 minutos


1. Migraciones: Construcción de una estación espacial

Las migraciones en Laravel son un sistema de control de versiones para tu base de datos.

Imagina que estás:

  1. 🏗️ Creando el plano de una estación (migración create_planets_table)
  2. 🚀 Desplegando módulos (ejecución de migraciones)
  3. 🔧 Modernizando la estructura (nuevas migraciones)
  4. ⏪ Puedes revertir a una versión anterior (rollback)

💡 Importante: Las migraciones permiten que el equipo trabaje de forma coordinada, ¡como ingenieros en diferentes continentes construyendo la ISS!


2. Ejecución de migraciones

Después de crear la migración en el capítulo 2.2, ejecuta:

php artisan migrate

Salida en la terminal:

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (25.12ms)
Migrating: 2014_10_12_100000_create_password_reset_tokens_table
Migrated:  2014_10_12_100000_create_password_reset_tokens_table (18.07ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (21.33ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (30.45ms)
Migrating: 2025_08_04_000000_create_planets_table
Migrated:  2025_08_04_000000_create_planets_table (15.67ms)  # ¡Tu tabla!

Verificación en pgAdmin 4:

  1. Abre la base de datos space_api → Schemas → Tables
  2. Asegúrate de que aparezcan: - planets - users - password_reset_tokens

3. Revertir migraciones: Retorno de emergencia

Si necesitas corregir la estructura:

php artisan migrate:rollback  # Revertir el último lote de migraciones
php artisan migrate:reset    # Reversión completa de todas las migraciones

  • php artisan migrate:fresh¡el comando más útil en desarrollo! Elimina todas las tablas y vuelve a ejecutar todas las migraciones.
  • php artisan migrate:fresh --seed — hace lo mismo que fresh, pero después de las migraciones, ejecuta inmediatamente los seeders. Este es un comando para la "recreación" completa de la base de datos desde cero.

Escenario de uso:

# Paso 1: Nos dimos cuenta de que hay un error en la migración. Recreamos completamente la base de datos.
php artisan migrate:fresh
# Paso 2: Editamos la migración
# Paso 3: Volvemos a crear la base de datos con la migración ya corregida.
php artisan migrate:fresh


4. Adición de nuevos campos: Modernización de la estación

Ejemplo: Añadiremos el campo is_habitable (¿es habitable el planeta?).

Paso 1: Creamos una nueva migración

php artisan make:migration add_is_habitable_to_planets_table

Paso 2: Editamos el archivo database/migrations/..._add_is_habitable_to_planets_table.php

<?php
public function up()
{
    Schema::table('planets', function (Blueprint $table) {
        $table->boolean('is_habitable')
              ->default(false);
    });
}

public function down()
{
    Schema::table('planets', function (Blueprint $table) {
        $table->dropColumn('is_habitable');
    });
}

Paso 3: Ejecutamos la actualización

php artisan migrate


5. Rellenar la base de datos: Los primeros planetas

Creamos un seeder — un script para generar datos de prueba.

Paso 1: Generación del seeder

php artisan make:seeder PlanetSeeder

Paso 2: Editamos database/seeders/PlanetSeeder.php

<?php
use App\Models\Planet; // ¡Importamos el modelo de planeta - Sin esto, obtendrás un error!


class PlanetSeeder extends Seeder
{
    public function run()
    {
        Planet::create([
            'name' => 'Tierra',
            'description' => 'Planeta azul con vida diversa',
            'size_km' => 12742,
            'solar_system' => 'Sistema Solar',
            'image_url' => 'https://example.com/earth.jpg',
            'is_habitable' => true
        ]);

        Planet::create([
            'name' => 'Marte',
            'description' => 'Planeta rojo, objetivo de futuras colonizaciones',
            'size_km' => 6779,
            'solar_system' => 'Sistema Solar',
            'is_habitable' => false
        ]);
    }
}

Paso 3: Registramos el seeder en database/seeders/DatabaseSeeder.php

<?php
public function run()
{
    $this->call([
        PlanetSeeder::class
    ]);
}

Paso 4: Ejecución del relleno

php artisan db:seed


6. Trabajar con PostgreSQL: Especificidades

Características del tipo de datos:

Característica PostgreSQL MySQL Comentario de Laravel
Tipo lógico boolean (verdadero true/false) tinyint(1) (almacena 0/1) $table->boolean('...') funciona para ambos
JSON jsonb (binario, indexable) json (de texto) $table->jsonb('...') - muy potente en PG
Arrays text[], integer[] (arrays nativos) No (emulado a través de JSON o cadenas) $table->array('...') (exclusivo para PG)
Orden de columnas No se puede controlar (after() no funciona) Se puede controlar (after()) Laravel lo abstrae, pero es necesario conocer la limitación

Ejemplo de creación de índice:

// En la migración
$table->index('solar_system');


7. Verificación de datos en psql

Puedes usar cualquier cliente gráfico y seleccionar space_api para visualizar los datos.

Al usar la consola:

psql -U postgres -d space_api
# La terminal puede solicitar la contraseña que configuraste al instalar PostgreSQL.
SELECT * FROM planets;

En cualquier caso, la salida debería ser la siguiente:

id name description size_km solar_system image_url is_habitable
1 Tierra Planeta azul con vida diversa 12742 Sistema Solar ... true
2 Marte Planeta rojo, objetivo de colonizaciones 6779 Sistema Solar null false

Cuestionario de repaso

1. Comando para ejecutar migraciones:

2. ¿Cómo revertir la última migración?

3. Los seeders se utilizan para:

4. Método para añadir una columna a una tabla existente:

5. ¿Dónde se registran los seeders?


🚀 Resumen del capítulo:

Has dominado la "construcción de infraestructura espacial":

  • ✅ Creaste y lanzaste migraciones
  • 🔧 Modernizaste la estructura de la tabla
  • 🌍 Llenaste la BD con los primeros planetas
  • ⚙️ Aprendiste a trabajar con PostgreSQL

¡Tu universo ha adquirido sus primeros mundos! Ahora puedes pasar a la creación de interfaces API para la gestión de planetas.

📌 Verificación:

  1. Ejecuta php artisan tinker
  2. Ejecuta App\Models\Planet::all()
  3. Asegúrate de ver la Tierra y Marte