Tabla de contenido:
-
Introducción
-
Bases de datos compatibles con Laravel
-
¿Cómo crear migraciones?
-
¿Cómo modificar una tabla existente?
-
Revertir migraciones
-
Visualizar SQL que las migraciones ejecutan
-
Creación de otros objetos en base de datos
Introducción
Las migraciones de base de datos de Laravel son una herramienta que permite manipular la estructura de la base de datos de tal forma que para los desarrolladores es legible y transparente cada cambio que se realiza, ya que se almacenan en archivos a manera de historial de cambios sin necesidad de modificar la base de datos de forma manual.
En la documentación oficial de Laravel definen a las migraciones como un control de versión para el esquema de base de datos debido a que permite definir y compartir la definición del esquema de la base de datos de la aplicación.
Para poder manipular es esquema de base de datos Laravel hace uso de la Facade Schema
las migraciones utilizarán esta fachada para crear y modificar tablas y columnas de bases de datos.
Bases de datos compatibles con Laravel
En la actualidad Laravel cuenta con drivers nativos para las siguientes bases de datos:
- MySQL
- MariaDB
- PostgreSQL
- SQLite
- SQL Server
También existen paquetes para otras bases de datos como:
- MongoDB
- Oracle
- Redis
¿Cómo crear migraciones?
Para crear las migraciones se utiliza el comando artisan make:migration
esto creará el archivo de migración en database/migrations
cada migración creada tiene una marca de tiempo en el nombre, esto permite determinar el orden en que se ejecutaran las migraciones.
php artisan make:migration create_tasks_table
Laravel usará 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 logra determinar el nombre de la tabla a partir del nombre de la migración lo completara en el archivo generado, de lo contrario puede especificar el nombre de la tabla de forma manual en el archivo de migración.
<?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('tasks', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tasks');
}
};
php artisan make:migration create_tasks_table
INFO Migration [database/migrations/2024_01_16_053346_create_tasks_table.php] created successfully.
Con esto se creará la tabla tasks en la base de datos con los campos:
- id
- name
- created_at
- updated_at
¿Cómo modificar una tabla existente?
Las migraciones también permiten modificar tablas existentes, esto es posible con el parámetro --table
y el valor debe ser el nombre de la tabla que se pretende modificar.
php artisan make:migration add_description_column_tasks_table --table=tasks
Con esto se genera una migración para alterar la tabla.
<?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::table('tasks', function (Blueprint $table) {
$table->text('description');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('tasks', function (Blueprint $table) {
$table->dropColumn('description');
});
}
};
Esto agregará una nueva columna al final de la tabla, si se utiliza MySQL o MariaDB puede utilizar el método after('column')
para indicar la posición de la nueva columna. Si se requiere cambiar el tipo de datos de alguna columna se debe realizar de la siguiente manera $table-text('name')-change();
Revertir migraciones
En cada archivo de migración se crea un método down()
dentro de ese método se escribe el código para invertir el método up()
si bien las migraciones crean deforma automática ese método esperando que se escriba el código no es recomendable, de preferencia se debe crear una migración para realizar la eliminación de tablas o columnas.
Comando para revertir las migraciones
php artisan migrate:rollback
Visualizar SQL que las migraciones ejecutan
Para visualizar el código SQL que se ejecutara en la base de datos existe el parámetro --pretend
esto muestra el código SQL que ejecutara según las migraciones pendientes.
php artisan migrate --pretend
INFO Running migrations.
2024_01_16_053346_create_tasks_table .............................................................................................................
⇂ create table "tasks" ("id" integer primary key autoincrement not null, "name" varchar not null, "created_at" datetime, "updated_at" datetime)
2024_01_16_054920_add_description_column_tasks_table .............................................................................................
⇂ alter table "tasks" add column "description" text not null
Creación de otros objetos en base de datos
En ocasiones es necesario crear vistas, triggers o procedimientos almacenados en la base de datos, en Laravel es posible utilizando la Facade \Illuminate\Support\Facades\DB
que proporciona el método statement
dentro del cual se debe agregar el código que permite crear el objeto que se necesita.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
DB::statement("CREATE VIEW vw_completed_tasks AS (
SELECT * FROM `tasks` ts
WHERE ts.status = 'completed'
)");
}
/**
* Reverse the migrations.
*/
public function down(): void
{
DB::statement("DROP VIEW vw_completed_tasks");
}
};
El sistema de Laravel es sencillo, pero poderoso ofrece muchos métodos que permiten administrar el esquema de la base de datos, lo cual garantiza el no recurrir a cambios manuales en la base de datos lo que puede generar errores en el funcionamiento de la aplicación.