Inicio » Blog »

6 abril, 2025

Migraciones en Laravel 12: Guía paso a paso

#Laravel #PHP

Para crear migraciones lo veremos en esta publicación te explicaremos todo lo que necesitas saber sobre las migraciones en Laravel

Migraciones en Laravel 12: Guía paso a paso

Suscríbete a nuestro canal en Youtube

Suscríbirse

Las migraciones en Laravel 12 son una herramienta poderosa para gestionar la estructura de tu base de datos desde el código. Funcionan como un control de versiones que te permite definir tablas, columnas e índices fácilmente, y compartir estos cambios con tu equipo.

¿Qué son las Migraciones en Laravel?

Las migraciones son el corazón de la gestión de bases de datos en Laravel. En lugar de escribir SQL puro, defines la estructura de tus tablas en PHP, y Laravel se encarga de traducirlo y crearlas por ti. Esto no solo simplifica el proceso, sino que también hace que tu base de datos sea portátil y reproducible en cualquier equipo o entorno, desde desarrollo hasta producción.

Ventajas de Usar Migraciones

  • Automatización: Olvídate de ejecutar scripts manuales.
  • Compatibilidad: Funciona con MySQL, PostgreSQL, SQLite y más.
  • Control: Revierte cambios fácilmente si algo sale mal.
  • Colaboración: Todos en tu equipo pueden aplicar los mismos cambios con un comando.

¿Cómo Crear Migraciones en Laravel 12?

  1. Crear una migración
    Usa el comando Artisan para crear una migración:

    bash

    php artisan make:migration create_posts_table

  2. Definir la estructura
    En el archivo generado en database/migrations, define la tabla:

    php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    return new class extends Migration {
        public function up(): void
        {
            Schema::create('posts', function (Blueprint $table) {
                $table->id();
                $table->string('nombre');
                $table->timestamps();
            });
        }
    
        public function down(): void
        {
            Schema::dropIfExists('posts');
        }
    };
  3. Ejecutar migraciones
    Aplica los cambios con:

    bash

    php artisan migrate


Ejecutar y Gestionar Migraciones

  • php artisan migrate: Ejecuta todas las migraciones pendientes.
  • php artisan migrate:rollback: Revierte la última tanda de migraciones.
  • php artisan migrate:refresh: Revierte y vuelve a ejecutar todas las migraciones.
  • php artisan migrate:status: Muestra el estado de cada migración.

Caso Práctico

A continuación, desarrollaré los modelos y migraciones en Laravel 12 para las tablas mencionadas en el diseño: Hoteles, Idiomas, Checkin y Huéspedes. Asumiré relaciones lógicas basadas en los campos descritos (como claves foráneas) y seguiré las mejores prácticas de Laravel. Cada migración incluirá los campos especificados, y los modelos tendrán las relaciones correspondientes.


1. Tabla Hoteles

Migración

Archivo: database/migrations/2025_04_06_000001_create_hoteles_table.php

php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::create('hoteles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('nombre');
            $table->string('direccion');
            $table->string('correo')->unique();
            $table->string('telefono');
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('hoteles');
    }
};

Modelo

Archivo: app/Models/Hotel.php

php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Hotel extends Model
{
    use HasFactory;

    protected $fillable = ['nombre', 'direccion', 'correo', 'telefono'];

    // Relación: Un hotel puede tener muchos check-ins
    public function checkins()
    {
        return $this->hasMany(Checkin::class, 'codigo_hotel');
    }
}

2. Tabla Idiomas

Migración

Archivo: database/migrations/2025_04_06_000002_create_idiomas_table.php

php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::create('idiomas', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('nombre', 10);
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('idiomas');
    }
};

Modelo

Archivo: app/Models/Idioma.php

php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Idioma extends Model
{
    use HasFactory;

    protected $fillable = ['nombre'];

    // Relación: Un idioma puede estar asociado a muchos check-ins
    public function checkins()
    {
        return $this->hasMany(Checkin::class, 'codigo_idioma');
    }
}

3. Tabla Checkin

Migración

Archivo: database/migrations/2025_04_06_000003_create_checkins_table.php

php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::create('checkins', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->date('entrada_reserva');
            $table->date('salida_reserva');
            $table->dateTime('ingreso_checkin')->default(now());
            $table->integer('num_adultos')->nullable();
            $table->integer('num_ninos')->nullable();
            $table->string('codigo_reserva');
            $table->unsignedBigInteger('codigo_hotel');
            $table->unsignedBigInteger('codigo_idioma');
            $table->timestamps();

            // Claves foráneas
            $table->foreign('codigo_hotel')->references('id')->on('hoteles')->onDelete('cascade');
            $table->foreign('codigo_idioma')->references('id')->on('idiomas')->onDelete('cascade');
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('checkins');
    }
};

Modelo

Archivo: app/Models/Checkin.php

php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Checkin extends Model
{
    use HasFactory;

    protected $fillable = [
        'entrada_reserva', 'salida_reserva', 'ingreso_checkin',
        'num_adultos', 'num_ninos', 'codigo_reserva',
        'codigo_hotel', 'codigo_idioma'
    ];

    // Relación: Un check-in pertenece a un hotel
    public function hotel()
    {
        return $this->belongsTo(Hotel::class, 'codigo_hotel');
    }

    // Relación: Un check-in pertenece a un idioma
    public function idioma()
    {
        return $this->belongsTo(Idioma::class, 'codigo_idioma');
    }

    // Relación: Un check-in tiene muchos huéspedes
    public function huespedes()
    {
        return $this->hasMany(Huesped::class, 'codigo_checkin');
    }
}

4. Tabla Huéspedes

Migración

Archivo: database/migrations/2025_04_06_000004_create_huespedes_table.php

php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::create('huespedes', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('nombre');
            $table->string('apellido');
            $table->string('correo')->unique();
            $table->string('nacionalidad');
            $table->enum('sexo', ['m', 'f']);
            $table->enum('tipo', ['adulto', 'nino']);
            $table->enum('titular', ['1', '0']);
            $table->date('fecha_nacimiento');
            $table->date('fecha_expiracion');
            $table->date('fecha_expedicion');
            $table->unsignedBigInteger('codigo_checkin');
            $table->unsignedBigInteger('tipo_documento');
            $table->string('numero_documento');
            $table->timestamps();

            // Claves foráneas
            $table->foreign('codigo_checkin')->references('id')->on('checkins')->onDelete('cascade');
            $table->foreign('tipo_documento')->references('id')->on('idiomas')->onDelete('cascade'); // Asumo que 'tipo_documento' referencia 'idiomas', ajusta si es otra tabla
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('huespedes');
    }
};

Modelo

Archivo: app/Models/Huesped.php

php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Huesped extends Model
{
    use HasFactory;

    protected $fillable = [
        'nombre', 'apellido', 'correo', 'nacionalidad', 'sexo',
        'tipo', 'titular', 'fecha_nacimiento', 'fecha_expiracion',
        'fecha_expedicion', 'codigo_checkin', 'tipo_documento', 'numero_documento'
    ];

    // Relación: Un huésped pertenece a un check-in
    public function checkin()
    {
        return $this->belongsTo(Checkin::class, 'codigo_checkin');
    }

    // Relación: Un huésped tiene un tipo de documento (asumiendo relación con Idiomas, ajusta si es otra tabla)
    public function tipoDocumento()
    {
        return $this->belongsTo(Idioma::class, 'tipo_documento');
    }
}

Notas Importantes

  1. Orden de Ejecución: Las migraciones deben ejecutarse en el orden presentado (Hoteles → Idiomas → Checkin → Huéspedes) debido a las dependencias de claves foráneas.
  2. Ajuste de tipo_documento: En el diseño original no se especificó una tabla Documentos. Asumí que tipo_documento en Huéspedes referencia Idiomas, pero si hay una tabla separada para tipos de documentos, deberías crear una migración adicional para documentos y ajustar la relación.
  3. Relaciones: Los modelos incluyen relaciones Eloquent (hasMany, belongsTo) para facilitar consultas.
  4. Campos fillable: Se definieron para permitir la asignación masiva en los modelos.

Ejecución

Para aplicar estas migraciones:

bash

php artisan migrate

Si necesitas revertir:

bash

php artisan migrate:rollback


Leido 21231 veces | 2 usuarios

Descarga del código fuente Laravel de Migraciones en Laravel 12: Guía paso a paso

Accede al código fuente esencial de nuestra aplicación en formato ZIP ó TXT. Ideal para desarrolladores que desean personalizar o integrar nuestra solución.

Opciones de descarga

  • Usuarios Registrados: Inicia sesión para descarga inmediata.
  • Nuevos Usuarios: Regístrate y descarga.

0 descargas

Para descargar el código inicia sesión o crea una cuenta

Iniciar Sesión

Compartir link del tutorial con tus amigos

Evaluación de Migraciones en Laravel

Test para medir cuanto sabes de migraciones en Laravel

1. ¿Qué son las migraciones en Laravel?

2. ¿Cuál es el propósito principal de las migraciones en Laravel?

3. ¿Qué método se utiliza en una migración para agregar nuevas tablas o columnas?

4. ¿Qué hace el método 'down' en una clase de migración?

5. ¿Qué comando de Artisan se usa para ejecutar migraciones en Laravel?

6. ¿Qué comando genera una nueva migración en Laravel?

7. ¿Qué se utiliza para definir el esquema de una tabla en una migración?

8. ¿Qué comando revierte todas las migraciones en Laravel?

9. ¿Qué ventaja ofrecen las migraciones al cambiar de motor de base de datos?

10. ¿Qué archivo configura la conexión a la base de datos en Laravel?

11. ¿Qué hace el comando 'php artisan migrate:fresh'?

12. ¿Qué función cumple el archivo 'database/seeds' en Laravel?

13. ¿Qué comando se utiliza para rellenar la base de datos con datos de prueba?

14. ¿Qué método se utiliza para eliminar una tabla en una migración?

15. ¿Qué significa que las migraciones sean como un control de versiones?


Curso de Laravel básico

USD 0.00

Descarga del código fuente

Curso de Laravel básico
Laravel Página Web Administrable

USD 37.00

Descarga del código fuente

Laravel Página Web Administrable

Codea Applications

México, Colombia, España, Venezuela, Argentina, Bolivia, Perú