Migraciones¶
Las migraciones en Laravel son archivos PHP que definen la estructura de las tablas de una base de datos utilizando una sintaxis propia del framework, sin necesidad de escribir SQL directamente. Funcionan como un historial versionado del esquema de base de datos, lo que permite crear, modificar o eliminar tablas de forma controlada, reproducible y coherente entre distintos entornos (desarrollo, producción, compañeros de equipo, etc.).
Los archivos de migración se almacenan en la carpeta database/migrations
y tienen extensión .php
. Cada archivo suele representar una tabla o una modificación concreta.
¿Por qué usar migraciones?
Imagina que estás desarrollando una aplicación que permite hacer un CRUD sobre clientes. Sabes que necesitarás una tabla en la base de datos para almacenar la información de cada cliente: nombre, apellidos, dirección, teléfono, etc.
Normalmente, eso lo harías escribiendo una sentencia SQL CREATE TABLE
, pero en Laravel puedes generar una migración, donde defines ese esquema de forma declarativa. Laravel se encargará de traducirlo al SQL correspondiente según el sistema gestor de base de datos que estés usando (MySQL, PostgreSQL, SQLite, etc.).
Esto te permite trabajar sin preocuparte por las diferencias de sintaxis entre sistemas de base de datos y, además, mantener un registro claro y controlado de cómo evoluciona la estructura de tu base de datos a lo largo del tiempo.
Crear migraciones¶
Para crear una migración es necesario utilizar el comando make:migration
de artisan para generar una migración de base de datos. La nueva migración será colocada en tu directorio database/migrations
. Cada nombre de archivo de migración contiene una marca de tiempo que permite a Laravel determinar el orden de las migraciones:
php artisan make:migration create_posts_table
Laravel utilizará el nombre de la migración para intentar adivinar el nombre de la tabla y si la migración creará o no una nueva tabla. Si Laravel es capaz de determinar el nombre de la tabla a partir del nombre de la migración, Laravel pre-llenará el fichero de migración generado con la tabla especificada. De lo contrario, puedes simplemente especificar la tabla en el fichero de migración manualmente.
Si deseas especificar una ruta personalizada para la migración generada, puedes utilizar la opción --path
al ejecutar el comando make:migration
. La ruta indicada debe ser relativa a la ruta base de la aplicación.
Estructura de una migración¶
Una clase de migración contiene dos métodos: up
y down
. El método up
se utiliza para añadir nuevas tablas, columnas o índices a tu base de datos, mientras que el método down
debe revertir las operaciones realizadas por el método up.
Dentro de ambos métodos, puedes utilizar el constructor de schemas
de Laravel para crear y modificar tablas de forma expresiva. Veamos como sería esta estructura básica en un ejemplo.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id(); // Clave primaria
$table->string('title'); // Título del post
$table->string('slug'); // Slug para URL amigable
$table->text('content'); // Contenido principal
$table->unsignedBigInteger('category_id'); // Relación con la categoría
$table->string('description'); // Descripción breve
$table->string('posted'); // Estado de publicación (e.g. 'not', 'yes')
$table->string('image'); // Ruta o nombre de la imagen
$table->timestamps(); // Campos created_at y updated_at
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::drop('posts');
}
};
Tipos de datos y restricciones en migraciones¶
Cuando definimos una tabla en una migración de Laravel, utilizamos métodos sobre el objeto $table
para indicar tanto el tipo de dato de cada campo como las restricciones que deben aplicarse. Laravel ofrece una interfaz muy legible para esto, y genera el SQL correspondiente en función del sistema gestor de base de datos (MySQL, PostgreSQL, etc.).
Tipos de datos más comunes¶
$table->string('campo')
: texto corto (por defecto 255 caracteres).$table->text('campo')
: texto largo (sin límite práctico).$table->integer('campo')
: número entero.$table->bigInteger('campo')
: número entero largo.$table->boolean('campo')
: valor verdadero o falso.$table->date('campo')
: solo fecha (YYYY-MM-DD).$table->datetime('campo')
: fecha y hora.$table->float('campo')
,$table->decimal('campo', 8, 2)
: números decimales.
Añadir restricciones¶
Las restricciones pueden encadenarse al definir el campo:
->nullable()
: permite valores nulos.->unique()
: valores únicos en la columna.->default('valor')
: valor por defecto si no se especifica otro.->unsigned()
: solo números positivos (habitual en claves foráneas).->index()
: crea un índice para mejorar el rendimiento de búsquedas.->foreign('campo')->references('id')->on('otra_tabla')
: define una clave foránea.
Llevar a cabo una migración¶
Antes de llevar a cabo una migración, necesito la conexión con la base de datos. Para ejecutar todas las migraciones pendientes, ejecuta el comando migrate
de artisan:
php artisan migrate
Deshaciendo una migración¶
Para deshacer la última operación de migración, puede utilizar el comando rollback
de artisan. Este comando retrocede el último "lote" de migraciones, que puede incluir múltiples archivos de migración:
php artisan migrate:rollback
Y si queremos deshacer todas las migraciones:
php artisan migrate:reset
Actividades¶
-
AC 717. (RA8 / CE8f / IC1 / 3p) - Realiza las migraciones de la aplicación de tareas. Luego modifica la tabla y realiza un rollback, esta parte la tienes que documentar.
-
AR 718. (RA8 / CE8f / IC1 / 3p) - Realiza las migraciones de la aplicación de blog.
-
PR 719. (RA8 / CE8f / IC2 / 5p) - Se te solicitan las migraciones necesarias para el proyecto de e-commerce. Tu CTO te pide que realices un rollback de todas las migraciones y luego las vuelvas a ejecutar, quiere asegurarse que pueden revocar cambios de manera ágil.
-
RE 720. (RA8 / CE8c CE8d CE8e CE8f CE8g / IC2 / 10p) Durante esta fase se inicia el desarrollo técnico del Reto 03, donde se construirá la aplicación de tipo e-commerce utilizando Laravel. El objetivo es aplicar correctamente el patrón MVC, crear las rutas necesarias, desarrollar los controladores y modelos, implementar formularios con validación en servidor y gestionar los roles de usuario. Esta fase parte del trabajo realizado en RE 615, donde se definió y generó la base de datos inicial del proyecto mediante migraciones.
Este bloque supone el núcleo de trabajo del reto, en el que debe integrarse toda la lógica de la aplicación y organizarse el trabajo cooperativo entre los miembros del grupo.
Durante el desarrollo se deben tener en cuenta los siguientes aspectos:
- El proyecto debe estar creado correctamente con Laravel 11 y funcionar en el entorno configurado (Docker o alternativo).
- Se ha seguido el patrón MVC de forma coherente, separando modelo, rutas y lógica de control.
- Las migraciones están correctamente definidas y relacionan adecuadamente las tablas.
- Se han creado y utilizado factorías y semilleros para generar datos de prueba.
- El sistema de autenticación y los roles de usuario (como mínimo: admin y cliente) están correctamente implementados.
- Los formularios creados están validados en el servidor y muestran mensajes adecuados.
- El administrador puede gestionar los productos (alta, edición, baja).
- Los productos pueden visualizarse de forma pública.
- Se ha desarrollado al menos una funcionalidad de exportación de datos (CSV o JSON).
- El código está organizado y sigue las convenciones del framework.
- El trabajo se ha realizado de forma cooperativa, con una distribución clara de roles.
Esta fase concluirá con la preparación de la presentación del reto y la documentación técnica del proyecto.