1. Introducción
En proyectos reales, En el desarrollo de una aplicación, suele ocurrir que el esquema de base de datos cambia continuamente: se añaden campos, se refactorizan tablas, se crean relaciones, se aplican restricciones, etc. Hacer estos cambios a mano en phpMyAdmin (o en un SQL suelto) suele romper la trazabilidad, dificulta el trabajo en equipo y hace frágiles los despliegues entre entornos (local, preproducción, producción).
Es cierto que una vez desarrollada la aplicación, la base de datos sigue siendo un elemento crítico, pero menos frecuentes, presentando pocos cambios (es algo ideal…).
Laravel resuelve esto con migraciones: una forma versionada, repetible y automatizable de definir la estructura de la base de datos como código. En un equipo, todos comparten el mismo histórico de cambios, y el proyecto puede “levantar” la base de datos desde cero de forma consistente.
A su vez, laravel nos va a ofrecer la posibilidad de poblar de forma automatizada las tablas de la base de datos, constituyendo un entorno ideal para poder probar nuestra aplicación según la vamos desarrollando.
Estos datos serán datos fictícios o datos faker, y constituirán un entorno ideal para poder probar nuestra aplicación.
Es un fichero PHP (una clase) que permite crear/modificar/eliminar tablas en nuestra aplicación (podríamos decir que es el principal uso que le vamos a dar).
Además, permite mantener un versionado del esquema de la base de datos, lo que hace posible replicarlo exactamente en cualquier entorno (desarrollo, pruebas o producción, o cuando se clone el proyecto) simplemente ejecutando un comando.
Schema Builder es la API de Laravel que permite definir tablas, columnas, índices y restricciones de forma expresiva, sin necesidad de escribir SQL manualmente.
Se utiliza dentro de las migraciones para estructurar la base de datos mediante métodos como create, table, string, integer, foreignId, etc.
Cuando hablamos aquí de API, estamos indicando un conjunto de métodos públicos disponibles en Schema y Blueprint, que podemos usar directamente. Son intuitivos y no necesitamos conocer su implementación. Es una librería de utilidades que tenemos disponibles:
## Ejemplos de métodos disponibles
use Illuminate\Support\Facades\Schema;
Schema::create()
Schema::table()
$table->string()
$table->integer()
$table->foreignId()
$table->timestamps()
$table->unique()
Es el objeto que representa el diseño de una tabla durante la ejecución de una migración.
Su uso es implícito, ya que Laravel lo inyecta, cuando usamos los métodos dentro de Schema::create() o Schema::table(). Permite permite definir columnas, índices y claves foráneas utilizando una sintaxis fluida y orientada a objetos.
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('student', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->string('address');
$table->timestamps();
});
up() / down()
- up(): Crea elementos: contiene las instrucciones para aplicar el cambio (crear tabla, añadir columnas, modificar estructura).
- down(): Elimina: revierte los cambios realizados en up() (eliminar tabla, eliminar columnas, etc.).
Esto permite que los cambios en la base de datos sean reversibles y controlados.
public function up(): void
{
Schema::create('student', function (Blueprint $table) {
$table->id();
$table->string('name');
});
}
public function down(): void
{
Schema::dropIfExists('student');
}
migrate / rollback / refresh son operaciones habituales ejecutadas desde Artisan:
- migrate: aplica las migraciones pendientes y crea las tablas definidas.
- rollback: revierte el último lote de migraciones ejecutadas.
- refresh: revierte todas las migraciones y las vuelve a ejecutar desde cero (muy útil en desarrollo).
Estas operaciones permiten gestionar la evolución del esquema de la base de datos de forma controlada.
Las migraciones
Las migraciones se guardan en: database/migrations
Laravel registra qué migraciones se han ejecutado en una tabla interna llamada migrations
Aunque es algo que no vamos a usar, es interesante saber que el proyecto guarda el histórico de cambios en Git y la base de datos guarda el “estado aplicado” en la tabla migrations. Podríamos deshacer los 3 ultimos cambios por ejemplo o el último o deshacer todo, como veremos a continuación
Acciones concretas
- Crear migración (nombra el cambio)
- Programar up() y down() (reversible)
- Ejecutar migrate (aplica en tu DB local)
- Subir cambios a Git
- En otro entorno (otro compañero / servidor), ejecutar migrate y obtener el mismo esquema
1.- Crear migraciones desde consola (Artisan)
php artisan make:migration create_students_table2.- Modificar una tabla existente
php artisan make:migration add_phone_to_students_table3.-Crear migración y modelo a la vez (opcional, pero común) Aunque no hemos visto qué es un modelo, lo vamos a necesitar para interactuar con la base de datos desde nuestra aplicación Lo estudiamos en el tema de modelos
php artisan make:model Student -mConvención de nombres :
- create_x_table para crear
- add_y_to_x_table para añadir
- remove_y_from_x_table para eliminar
- update_x_table o change_y_in_x_table para cambios complejos
Estructura de una migración
Una migración típica tiene esta forma:
|
|
Puntos importantes :
- Schema::create define una tabla desde cero
- Blueprint $table define columnas, índices, etc.
- down() revierte de forma segura con dropIfExists
- up() Ejecuta la migración creando los elementos especificados (crear o modificar)
Ejecutar migraciones
Las principales acciones que vamos a realizar con las migraciones son las siguientes
Ejecutar todas las migraciones pendientes
php artisan migrateConsultar el estado de las migraciones
|
|
Deshacer última acción (última migración ejecutado)
|
|
Deshacer las últimas N migraciones ejecutadas
|
|
Reiniciar el esquema completo (rollback total + migrate)
|
|
Borrar todas las tablas y volverlo a crear (muy usado en desarrollo) Esta acción la haremos con mucha frecuencia
|
|
Borrar todo y además ejecutar los seeders
|
|
- fresh es ideal para desarrollo local cuando puedes perder datos
- en producción casi siempre se usa migrate (nunca fresh)
4.6. Tipos de columnas más habituales (Laravel 12)
Identificadores y timestamps- id(): BIGINT autoincremental
- timestamps(): created_at / updated_at
- softDeletes(): deleted_at para borrado lógico
|
|
- string: VARCHAR(255) por defecto
- text: TEXT
- integer, bigInteger
- decimal(8,2) para importes
- boolean
|
|
- date, time, dateTime
- timestamp
|
|
Índices y restricciones: performance + integridad
El tema de índices es muy importante y lo tenemos que tener muy claro
Índices y únicos- index() acelera búsquedas
- unique() evita duplicados
|
|
Regla práctica :
- index: para columnas que se filtran mucho (where)
- unique: para “identificadores” (email, dni, código, etc.)
Resumen
- Las migraciones nos van a permitir crear la base de datos y gestionarla
- Permiten versionar el esquema de base de datos como código.
- Se crean con make:migration y se aplican con migrate.
- up() aplica cambios; down() los revierte: migraciones reversibles son más profesionales.
- Schema Builder define columnas, índices y claves foráneas de forma expresiva.
- Evita editar migraciones ya ejecutadas: crea nuevas migraciones para corregir/refactorizar.
- En producción, normalmente se usa migrate (no fresh).
referencias
-
Documentación oficial de Laravel: Migrations / Schema Builder
-
Artisan: comandos de migración (migrate, rollback, fresh, status)
