6 abril, 2025
Migraciones en Laravel 12: Guía paso a paso
Para crear migraciones lo veremos en esta publicación te explicaremos todo lo que necesitas saber sobre las migraciones en Laravel

Suscríbete a nuestro canal en Youtube
SuscríbirseLas 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?
-
Crear una migración
Usa el comando Artisan para crear una migración:bash
php artisan make:migration create_posts_table
-
Definir la estructura
En el archivo generado endatabase/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'); } };
-
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
- 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.
- 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.
- Relaciones: Los modelos incluyen relaciones Eloquent (hasMany, belongsTo) para facilitar consultas.
- 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.
Evaluación de Migraciones en Laravel
Test para medir cuanto sabes de migraciones en Laravel