Saltar al contenido principal

Migraciones

¿Qué es una migración?

En términos simples, una migración en Laravel es un conjunto de instrucciones que permiten a los desarrolladores crear o modificar la estructura de una base de datos en su aplicación web. En lugar de modificar manualmente la base de datos, los desarrolladores pueden crear archivos de migración que describen los cambios que deben hacerse. Estos archivos de migración se ejecutan automáticamente utilizando comandos de Artisan, lo que permite a los desarrolladores actualizar la estructura de la base de datos de manera controlada y coherente con la evolución de la aplicación. En resumen, las migraciones son una herramienta útil que permite a los desarrolladores administrar la estructura de la base de datos de manera programática y coherente, lo que puede ahorrar tiempo y reducir errores en la gestión de la base de datos.

Uno de los beneficios clave de utilizar migraciones es el control de versiones. Al utilizar archivos de migración, los desarrolladores pueden mantener un registro de los cambios en la estructura de la base de datos a medida que evoluciona la aplicación. Esto es especialmente útil cuando hay varios desarrolladores trabajando en el mismo proyecto o cuando se realiza un seguimiento de diferentes versiones de la aplicación. Cada archivo de migración se puede etiquetar con un número de versión, lo que ayuda a los desarrolladores a realizar un seguimiento de los cambios y a asegurarse de que todos los miembros del equipo estén trabajando con la misma versión de la base de datos.

Otro beneficio importante de las migraciones es que pueden ahorrar tiempo y reducir errores en la gestión de la base de datos. En lugar de tener que modificar manualmente la base de datos cada vez que se realizan cambios en la estructura de la base de datos, los desarrolladores pueden crear archivos de migración que describen los cambios que deben hacerse. Estos archivos de migración se pueden ejecutar automáticamente utilizando comandos de Artisan, lo que ahorra tiempo y reduce la posibilidad de errores humanos.

Además, las migraciones en Laravel también son muy flexibles. Los desarrolladores pueden crear migraciones para agregar nuevas tablas, modificar columnas existentes, agregar restricciones de clave foránea, crear índices, eliminar tablas y mucho más. Cada migración se compone de dos métodos principales: el método "up" que describe los cambios que deben realizarse en la base de datos y el método "down" que describe cómo deshacer esos cambios.

En resumen, las migraciones en Laravel son una herramienta esencial para administrar la estructura de la base de datos de manera programática y coherente con la evolución de la aplicación. Al utilizar migraciones, los desarrolladores pueden mantener un registro de los cambios de la base de datos, ahorrar tiempo y reducir errores en la gestión de la base de datos, y tener una gran flexibilidad para realizar cambios en la estructura de la base de datos.

Modelo ER

Este es el modelo entidad/relación de nuestra BB.DD.

Modelo E/R

¿Qué es una migración?

Una migración en Laravel es un archivo de PHP que describe una operación de base de datos, como la creación de una tabla o la modificación de una columna existente. Las migraciones permiten que los desarrolladores gestionen los cambios en la estructura de la base de datos de manera sencilla y segura, ya que todos los cambios se realizan a través de archivos que se pueden controlar con un sistema de control de versiones como Git.

Cuando se ejecutan las migraciones, Laravel las aplica automáticamente a la base de datos mediante una serie de comandos SQL. Esto garantiza que la estructura de la base de datos sea la misma en todas las instancias del proyecto, ya sea en un entorno de desarrollo local, en un servidor de pruebas o en producción.

Además, las migraciones también proporcionan un mecanismo para revertir los cambios en la base de datos, lo que es útil en caso de que se deban hacer cambios en la estructura de la base de datos y luego se deba revertir a una versión anterior.

En resumen, las migraciones en Laravel son una herramienta esencial para el desarrollo de aplicaciones que requieren una gestión de base de datos robusta y fácil de usar.

Para saber más

Para más información consulte la documentación oficial de Laravel.

Generando migraciones en Laravel

A continuación, generaremos las migraciones necesarias para crear la estructura requerida en nuestra base de datos. Crearemos todas las tablas necesarias para nuestra aplicación de comercio electrónico a través de estas migraciones. Comenzaremos con las tablas más simples y avanzaremos hasta nuestra tabla principal, conocida como Cervezas.

Como es ampliamente reconocido, una cerveza suele contar con una serie de características o propiedades que comparte con otras cervezas, al tiempo que la distinguen de las demás. Entre estas características se encuentra el color. Existen varios tipos de colores estandarizados, como tostado, ámbar, negro y amarillo, que definen el color de una cerveza.

Empezaremos creando la tabla Colores, la cual almacenará todos los colores de las cervezas y se relacionará con nuestra tabla de Cervezas.

Para crear la migración de la tabla de categorías, ingrese el siguiente comando:

php artisan make:migration create_colores_table

Para generar una migración en Laravel 11, se suele utilizar el comando php Artisan make:migration: nombreDeLaMigración. Es el comando que hemos ejecutado anteriormente, donde NombreDeLaMigracion es el nombre que le quieres dar a la migración, y nombre_de_la_tabla es el nombre de la tabla que se creará en la base de datos.

Esto creará un archivo de migración en la carpeta database/migrations con un nombre similar a yyyy_mm_dd_hhmmss_NombreDeLaMigracion.php.

Luego, puedes editar ese archivo para definir las columnas que deseas agregar a la tabla. Finalmente, ejecuta el comando php artisan migrate para aplicar las migraciones a la base de datos.

A continuación, veamos qué nos ha generado el comando anterior.

Definiendo las tablas de la Base de Datos

Tabla de Colores

Veamos qué ha hecho el comando anteriormente ejecutado:

Migración de colores
php artisan make:migration create_colores_table
Importante

Siga la convención en sus creaciones de tabla utilizando create_nombre_de_tabla_table, si quiere evitarse problemas en el futuro.

La fecha de la migración es importante, ya que esta determina el orden de ejecución de las mismas. Esto es importante en el caso de que tengamos tablas relacionadas; deberemos crear primero las entidades fuertes que las entidades débiles.

Diríjase al directorio database/migrations y edite el archivo con la migración. Podrá observar el siguiente código.

<?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('colores', function (Blueprint $table) {
$table->id();
$table->text('descripcion')->nullable();
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('colores');
}
};

El código crea una clase anónima que extiende la clase Migration de Illuminate y define dos métodos: up() y down().

El método up() es invocado cuando se ejecuta el comando php artisan migrate y se utiliza para crear la tabla "categorías" en la base de datos con las siguientes columnas:

id: una columna con clave primaria que se genera automáticamente como una secuencia incremental. nombre: una columna de tipo cadena con un tamaño máximo de 150 caracteres que es única. descripcion: una columna de tipo texto. imagen: una columna de tipo texto que puede ser nula. created_at y updated_at: dos columnas de tipo fecha y hora que se generan automáticamente y se actualizan automáticamente al insertar o actualizar un registro. El método down() es invocado cuando se ejecuta el comando php artisan migrate:rollback y se utiliza para eliminar la tabla "categorías".

Ahora veremos como añadir campos a nuestra tabla:

tipos de datos más comunes en Laravel

En Laravel, los tipos de datos en las migraciones se refieren a las especificaciones de los tipos de columnas en las tablas de la base de datos. Algunos de los tipos de datos más comunes incluyen:

  • bigIncrements: Incremento automático de ID grande
  • bigInteger: Entero grande
  • binary: Datos binarios
  • boolean: Valor booleano
  • char: Cadena fija de longitud
  • date: Fecha
  • dateTime: Fecha y hora
  • decimal: Número decimal con precisión y escala específicas
  • double: Número de punto flotante de doble precisión
  • enum: Valor de una lista predefinida
  • float: Número de punto flotante
  • increments: Incremento automático de ID
  • integer: Entero
  • json: Datos en formato JSON
  • longText: Texto largo
  • mediumText: Texto de tamaño medio
  • smallInteger: Entero pequeño
  • string: Cadena
  • text: Texto
  • time: Tiempo
  • timestamp: Marca de tiempo
  • unsignedBigInteger: Entero grande sin signo
  • unsignedInteger: Entero sin signo.

Estos son algunos de los tipos de datos más comunes que puedes usar en tus migraciones en Laravel.

Vamos a añadir una columna a nuestra tabla, donde guardaremos el nombre del color:

<?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('colores', function (Blueprint $table) {
$table->id(); // Campo ID autoincremental
$table->string('nombre')->unique(); // Ejemplo de otro campo, puedes añadir los necesarios
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('colores');
}
};

Revisando la tabla migraciones

idmigrationBatch
12014_10_12_000000_create_users_table1
22014_10_12_100000_create_password_reset_tokens_table1
32019_08_19_000000_create_failed_jobs_table1
42019_12_14_000001_create_personal_access_tokens_table1
52023_10_21_205846_create_colores_table2

La tabla migraciones de Laravel es utilizada por el sistema de migraciones de Laravel para realizar un seguimiento de las migraciones que se han ejecutado en la base de datos. A continuación, te explico el significado de cada columna en la tabla:

  1. ID: Este es un identificador único para cada migración. Cada vez que ejecutas una migración, se registra en esta tabla con un nuevo ID. Esto ayuda a realizar un seguimiento de todas las migraciones que se han aplicado.

  2. Nombre de migración: Esta columna almacena el nombre del archivo de migración, que suele seguir un formato de fecha y hora, seguido de un nombre descriptivo de la migración. Este nombre es utilizado por Laravel para determinar qué migraciones se deben ejecutar y en qué orden.

  3. Batch: El campo "Batch" indica a qué grupo o "lote" de migraciones pertenece esta migración. Esto es útil cuando deseas ejecutar migraciones en lotes separados. Por defecto, todas las migraciones se asignan al lote 1, pero puedes cambiar esto en el código de la migración si deseas agruparlas de manera diferente.

En resumen, la tabla migraciones en Laravel lleva un registro de todas las migraciones que se han aplicado a la base de datos, con información sobre su orden, identificación y el lote al que pertenecen. Esto es fundamental para mantener la integridad de la base de datos y realizar un seguimiento de los cambios en el esquema a lo largo del tiempo.

Tabla Tipos

En esta tabla guardaremos los distintos de cerveza, como el tipo Ale,IPA,negra,etc.

Para crear la migración ejecute el siguiente comando desde su terminal.

Migración de categorías
php artisan make:migration create_tipos_table

Diríjase el directorio database/migrations y siga el mismo procedimiento que el ejemplo anterior.

Sustituya el código generado por el siguiente código:

<?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('tipos', function (Blueprint $table) {
$table->id();
$table->string(`nombre`,100)->unique();
$table->text('descripcion')->nullable();
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tipos');
}
};

Tabla Paises

Para crear la migración ejecute el siguiente comando desde su terminal.

Migración de paises
php artisan make:migration create_pais_table

Diríjase el directorio database/migrations y siga el mismo procedimiento que el ejemplo anterior.

Sustituya el código generado por el siguinte código:

<?php

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

return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('paises', function (Blueprint $table) {
$table->id();
$table->string("nombre")->unique();
$table->text('descripcion')->nullable();
$table->timestamp();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('paises');
}
};

Tabla Provincias

Para crear la migración ejecute el siguiente comando desde su terminal.

Migración de provincias
php artisan make:migration create_provinicias_table

Diríjase el directorio database/migrations y siga el mismo procedimiento que el ejemplo anterior.

Sustituya el código generado por el siguinte código:

<?php

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

return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('provincias', function (Blueprint $table) {
$table->id();
$table->string("codigo",2)->unique();
$table->string("nombre");
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('provincias');
}
};

Tabla Poblaciones

Para crear la migración ejecute el siguiente comando desde su terminal.

Migración de poblaciones
php artisan make:migration create_poblaciones_table

Diríjase el directorio database/migrations y siga el mismo procedimiento que el ejemplo anterior.

Sustituya el código generado por el siguinte código:

<?php

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

return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('poblaciones', function (Blueprint $table) {
$table->id();
$table->string("codigo",5)->unique();
$table->string("nombre");
$table->string("provincia_cod",2);
$table->foreign("provincia_cod")->references("codigo")->on("provincias");
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('poblaciones');
}
};

Tabla graduaciones

Para crear la migración ejecute el siguiente comando desde su terminal.

Migración de graduaciones
php artisan make:migration create_graduacion_table

Diríjase el directorio database/migrations y siga el mismo procedimiento que el ejemplo anterior.

Sustituya el código generado por el siguinte código:

<?php

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

return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('graduaciones', function (Blueprint $table) {
$table->id();
$table->string("nombre",50)->unique();
$table->text('descripcion')->nullable();
$table->timestamp();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('graduaciones');
}
};


Tabla Cervezas

Para crear la migración ejecute el siguiente comando desde su terminal.

Migración de cervezas
php artisan make:migration create_cervezas_table

Diríjase el directorio database/migrations y siga el mismo procedimiento que el ejemplo anterior.

Sustituya el código generado por el siguinte código:

<?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('cervezas', function (Blueprint $table) {
$table->id();
$table->string('nombre',150)->unique();
$table->text('descripcion');
$table->unsignedBigInteger('color_id');
$table->foreign('color_id')->references('id')->on('colores');
$table->unsignedBigInteger('graduacion_id');
$table->foreign('graduacion_id')->references('id')->on('graduaciones');
$table->unsignedBigInteger('tipo_id');
$table->foreign('tipo_id')->references('id')->on('tipos');
$table->unsignedBigInteger('pais_id');
$table->foreign('pais_id')->references('id')->on('paises');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('cervezas');
}
};

Integridad referencial

La integridad referencial es un concepto en las bases de datos que se refiere a la consistencia y precisión de las relaciones entre las tablas. Implica que las relaciones entre las tablas de la base de datos se mantengan de manera coherente y se respeten las restricciones definidas. La integridad referencial es importante por varias razones:

  1. Consistencia de Datos: Garantiza que los datos en la base de datos sean coherentes y precisos. Las relaciones entre las tablas reflejan relaciones en el mundo real, lo que ayuda a evitar inconsistencias y errores de datos.

  2. Evita Datos Huérfanos: Evita que queden registros huérfanos o sin relación cuando se eliminan o actualizan registros relacionados en otras tablas. Esto ayuda a mantener la integridad de la base de datos.

  3. Mantiene la Integridad: Asegura que las operaciones de eliminación o actualización en una tabla no generen resultados inesperados o incorrectos en las tablas relacionadas.

  4. Mejora la Calidad de los Datos: Contribuye a la calidad de los datos al garantizar que los datos sean precisos y relevantes para las relaciones en la base de datos.

En este ejemplo de código, estamos utilizando migraciones de Laravel para definir la estructura de una tabla llamada "cervezas". En esta tabla, estás estableciendo relaciones de clave foránea con otras tablas, como "colores", "graduaciones", "tipos" y "paises". Esto es un ejemplo de cómo se implementa la integridad referencial en una base de datos.

Cuando defines las relaciones de clave foránea en la tabla "cervezas", estás diciendo que el campo color_id debe hacer referencia al campo id en la tabla "colores", el campo graduacion_id debe hacer referencia al campo id en la tabla "graduaciones", y así sucesivamente. Esto garantiza que solo se puedan insertar valores en la tabla "cervezas" que tengan relaciones válidas con las otras tablas.

Por ejemplo, si intentaras insertar una cerveza con un valor de color_id que no existe en la tabla "colores" (violando la integridad referencial), Laravel generaría un error y no permitiría la inserción. Esto es importante para mantener la coherencia y la precisión de los datos en la base de datos y garantizar que las relaciones entre las tablas se mantengan de manera correcta y consistente.

Importante

Cuando establecemos una relación entre dos tablas, debemos asegurarnos de que la clave foránea de la tabla y la tabla hija utilizan el mismo tipo de dato. Si esto no se cumple el motor de base de datos nos dara un error.

$table->unsignedBigInteger('color_id');
$table->foreign('color_id')->references('id')->on('colores');

En este ejemplo establecemos que la clave foránea va ser un entero de 64 bits sin signo. Este es el tipo por defecto que establece Laravel para los campos tipo id.

Tipos de restricciones para las claves foráneas

Puedes aplicar varias restricciones a una clave foránea (FK) en Laravel utilizando el método on en la definición de la clave foránea. Algunas de las restricciones comunes que puedes aplicar incluyen:

  1. ON DELETE CASCADE: Esta restricción especifica que cuando se elimina el registro principal en la tabla padre, también se eliminarán automáticamente todos los registros secundarios relacionados en la tabla hija.

    Ejemplo:

    $table->foreign('color_id')->references('id')->on('colores')->onDelete('cascade');
  2. ON DELETE SET NULL: Esta restricción establece el valor de la clave foránea en NULL cuando se elimina el registro principal en la tabla padre. Esto se utiliza cuando deseas permitir que los registros secundarios queden huérfanos.

    Ejemplo:

    $table->foreign('color_id')->references('id')->on('colores')->onDelete('set null');
  3. ON DELETE RESTRICT: Esta restricción evita que se elimine el registro principal si existen registros secundarios relacionados en la tabla hija. Es la restricción predeterminada si no se especifica ninguna otra.

    Ejemplo:

    $table->foreign('color_id')->references('id')->on('colores')->onDelete('restrict');
  4. ON DELETE NO ACTION: Similar a "RESTRICT", esta restricción evita que se elimine el registro principal si existen registros secundarios relacionados en la tabla hija.

    Ejemplo:

    $table->foreign('color_id')->references('id')->on('colores')->onDelete('no action');
  5. ON UPDATE CASCADE: Esta restricción especifica que cuando se actualiza el valor de la clave primaria en la tabla padre, los valores de la clave foránea en la tabla hija también se actualizarán automáticamente.

    Ejemplo:

    $table->foreign('color_id')->references('id')->on('colores')->onUpdate('cascade');
  6. ON UPDATE SET NULL: Esta restricción establece el valor de la clave foránea en NULL cuando se actualiza el valor de la clave primaria en la tabla padre.

    Ejemplo:

    $table->foreign('color_id')->references('id')->on('colores')->onUpdate('set null');

Estas restricciones te permiten definir cómo se deben manejar las operaciones de eliminación y actualización en las relaciones de clave foránea en Laravel para mantener la integridad referencial en la base de datos. Puedes elegir la restricción que mejor se adapte a tus necesidades según el comportamiento deseado en tu aplicación.

Modificando la tabla cervezas

Hasta ahora hemos visto como crear nuestras tablas, pero no como modificarlas. Vamos a estudiar como modificar nuestra tabla cervezas. Nos hemos dado cuenta que nos hemos dejado dos campos en la tabla. Uno llamado novedad de tipo booleano que indicara si el producto es una novedad y otro oferta que indicara si nuestro producto esta en oferta.

En la siguiente migración modificaremos la tabla proveedores.

Modficación de la tabla cervezas
php artisan make:migration add_fields_cervezas_table

Sustituya el código generador por el siguiente código:

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

class ModifyCervezasTable extends Migration
{
/**
* Run the migrations.
*/
public function up()
{
Schema::table('cervezas', function (Blueprint $table) {
$table->boolean('novedad')->default(false);
$table->boolean('oferta')->default(false);
$table->decimal('precio', 8, 2)->default(0); // 8 dígitos en total y 2 decimales
$table->string('foto')->default('');
$table->string('marca', 150)->default('');
});
}

/**
* Reverse the migrations.
*/
public function down()
{
Schema::table('cervezas', function (Blueprint $table) {
$table->dropColumn(['novedad', 'oferta', 'precio', 'marca']);
});
}
}

A continuación vamos a ejecutar todas las migraciones pendientes:

php artisan migrate

Después de ejecutar la migración de "Cervezas" deberemos adaptar el modelo a nuestra tabla añadiendo los campos que faltan. Edite el modelo Cerveza y modifique la propiedad fillable, introduciremos los campos que faltan:

protected $fillable = [
'nombre',
'descripcion',
'color_id',
'graduacion_id',
'tipo_id',
'pais_id',
'novedad',
'oferta',
'precio',
'foto',
'marca'
];

Utilizar SQL nativo

¿Por qué utilizar SQL en nuestras migraciones?

Utilizar SQL nativo en las migraciones de Laravel puede ser una elección apropiada en ciertas situaciones debido a las siguientes justificaciones:

  1. Flexibilidad y Control Total: Al escribir SQL nativo en las migraciones, tienes un control total sobre la ejecución de comandos SQL. Esto es fundamental cuando necesitas realizar tareas más avanzadas o específicas que no son directamente compatibles con las funciones proporcionadas por Laravel.

  2. Compatibilidad con Características Específicas de la Base de Datos: Cada sistema de gestión de bases de datos (DBMS) puede tener características específicas que no se pueden aprovechar completamente utilizando la sintaxis de Laravel. Utilizar SQL nativo te permite explotar las capacidades únicas de tu DBMS.

  3. Optimización de Rendimiento: En ocasiones, escribir SQL personalizado puede ser más eficiente en términos de rendimiento que utilizar métodos de alto nivel de Laravel. Esto es especialmente cierto cuando trabajas con bases de datos masivas o necesitas consultas altamente optimizadas.

  4. Migraciones Heredadas o Externas: Si migras una base de datos existente o trabajas con migraciones heredadas escritas en SQL, puede ser más sencillo y consistente seguir utilizando SQL nativo en lugar de traducir todo a sintaxis de Laravel.

  5. Conversión Gradual: A menudo, las migraciones pueden implicar una conversión gradual de una base de datos existente a un nuevo esquema. El uso de SQL nativo te permite realizar estas conversiones de manera más eficiente sin depender de las capacidades específicas de Laravel.

  6. Mantenimiento de Código Existente: Si estás trabajando en un proyecto heredado que ya utiliza SQL nativo en sus migraciones, mantener la consistencia y la integridad en el código existente puede ser una justificación válida para continuar utilizando esta práctica.

  7. Depuración y Pruebas: Utilizar SQL nativo puede simplificar la depuración y las pruebas de migraciones, ya que puedes ejecutar y probar directamente las consultas en tu sistema de gestión de bases de datos.

Es importante mencionar que mientras SQL nativo puede ser útil en ciertos casos, Laravel ofrece un conjunto de herramientas sólidas para gestionar migraciones de base de datos a través de su sintaxis específica. La elección entre SQL nativo y las funciones de migración de Laravel depende del contexto y de los requisitos del proyecto. En muchos casos, una combinación de ambos enfoques puede ser la solución más adecuada.

Creación de vistas

<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Migrations\Migration;

return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// Ejecuta la sentencia SQL para crear o reemplazar la vista
DB::statement('
CREATE OR REPLACE VIEW v_cervezas AS
SELECT
cer.id AS id,
cer.nombre AS nombre,
cer.descripcion AS descripcion,
cer.color_id AS color_id,
cer.graduacion_id AS graduacion_id,
cer.novedad AS novedad,
cer.oferta AS oferta,
cer.precio AS precio,
cer.foto AS foto,
cer.marca AS marca,
col.nombre AS color,
g.nombre AS graduacion,
t.nombre AS tipo,
p.nombre AS pais
FROM
cervezas cer
JOIN colores col ON (cer.color_id = col.id)
JOIN graduaciones g ON (cer.graduacion_id = g.id)
JOIN tipos t ON (t.id = cer.tipo_id)
JOIN paises p ON (p.id = cer.pais_id)
ORDER BY nombre
');
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// Si deseas eliminar la vista en una migración de reversión, puedes hacerlo así:
DB::statement('DROP VIEW IF EXISTS v_cervezas');
}
};
IDNombreImagen_cerveza_fotoDescripciónNovedadOfertaPrecioMarcaColorGraduaciónTipoPaís
1POMELO IPA IDA Y VUELTA 24x33clImagen 1**Estilo POMELO IPA. Sin gluten** 5,8 % ABV IBU´S 50, amarga. **INGREDIENTES: **Agua; maltas de trigo Torrefacto y Extra pale; lúpulos Cascade, Columbus y Citra, copos de AVENA, zumo y cascara de pomelo, y levadura Ale. Gastos de envío España Peninsu...0059.81DouGall'sAmarilloMuy alta (9-12)Lager/PilsnerEspaña
2DIPA or Nothing 12x33Imagen 2Estilo: DDH Doble IPA Alcohol: 7,5 % Abv IBU’S: 70 Bastante Amarga Sin gluten Ingredientes , Agua, maltas y lúpulos Incognito Mosaic, Azacca y Vic Secret. Gastos de envío España Peninsular incluidos.0046.58DIPA or NothingTostadaAlta (7-9)Sour BeerAlemania

Creación de triggers

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

class CreateTriggerCervezas extends Migration
{
/**
* Run the migrations.
*/
public function up()
{
// Crear la tabla cervezas_copia
DB::unprepared('
CREATE TABLE cervezas_copia AS
SELECT *, "INSERT" AS operacion, NOW() AS fecha_operacion
FROM cervezas WHERE 1=0;
');



// Crear el trigger
DB::unprepared('
CREATE TRIGGER copiar_cervezas_after_update
AFTER UPDATE ON cervezas FOR EACH ROW
BEGIN
INSERT INTO cervezas_copia (id, nombre, descripcion, color_id, graduacion_id, tipo_id, pais_id, created_at, updated_at, operacion,fecha_operacion)
SELECT OLD.id, NEW.nombre, OLD.descripcion, OLD.color_id, OLD.graduacion_id, OLD.tipo_id, OLD.pais_id, OLD.created_at, OLD.updated_at, "UPDATE",NOW();
END;
');


DB::unprepared('
CREATE TRIGGER copiar_cervezas_before_delete
BEFORE DELETE ON cervezas FOR EACH ROW
BEGIN
INSERT INTO cervezas_copia (id, nombre, descripcion, color_id, graduacion_id, tipo_id, pais_id, created_at, updated_at, operacion,fecha_operacion)
SELECT OLD.id, OLD.nombre, OLD.descripcion, OLD.color_id, OLD.graduacion_id, OLD.tipo_id, OLD.pais_id, OLD.created_at, NOW(), "DELETE",NOW();
END;
');

}

/**
* Reverse the migrations.
*/
public function down()
{
// Eliminar los triggers
DB::unprepared('DROP TRIGGER IF EXISTS copiar_cervezas_after_update');

// Eliminar los triggers
DB::unprepared('DROP TRIGGER IF EXISTS copiar_cervezas_before_delete');


// Eliminar la tabla cervezas_copia
DB::unprepared('DROP TABLE IF EXISTS cervezas_copia');
}
}

Creación de procedimientos almacenados

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up()
{
DB::unprepared('
CREATE PROCEDURE IF NOT EXISTS GetCervezasByPais(IN paisId INT)
BEGIN
SELECT * FROM cervezas WHERE pais_id = paisId;
END;
');
}

/**
* Reverse the migrations.
*/
public function down()
{
DB::unprepared('DROP PROCEDURE IF EXISTS GetCervezasByPais');
}
};