Hoy aprenderemos a usar las migraciones en Laravel 5.
Con las migraciones lo que hacemos es versionar la base de datos de nuestro proyecto de forma que si nosotros hacemos una serie de cambios en la estructura de la base de datos, cuando un compañero se baje del repositorio nuestros cambios en el código del proyecto ejecutará las migraciones que nosotros le hemos generado y estas harán los cambios necesarios en la base de datos.
Esta es una forma muy cómoda, rápida y segura de trabajar ya que no tenemos que andar creando ficheros SQL, exportando bases de datos y pasándoselas a los compañeros, lo cual a veces nos hace perder bastante tiempo.
Esto no es necesario para trabajar con Laravel 5 pero si que es una práctica recomendable.
Crear migraciones
Para crear migraciones ejecutaremos el comando php artisan make:migration create_users_table
desde la consola en la raíz del proyecto. Si queremos que automatica nos genere la estructura básica de la tabla con Schema Builder en la migración podemos usar la opción --table=nombre-de-la-tabla
.
En mi caso crearé dos migraciones, una para la tabla películas y otra para la tabla cineastas.
php artisan make:migration create_cineastas_table --create=cineastas php artisan make:migration create_peliculas_table --create=peliculas
Ahora veremos que nos ha generado dos ficheros de migración en el directorio database/migrations.
Crear estructura de las tablas con Schema Builder
Con Schema Builder podemos hacer cualquier tipo de operación con la estructura de tablas de la base de datos, pero en nuestro caso solamente crearemos estas dos tablas. La ventaja de usar esto en lugar de SQL crudo es que nos abstraemos del SGBD que usamos.
Una migración siempre tendrá dos «eventos» up y down.
Up para cuando se ejecuta y se hacen los cambios en la base de datos.
Down para cuando se ejecuta un rollback de la migración para volver a un estado anterior de la base de datos.
Migración de cineastas:
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCineastasTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { //Crear una tabla con Schema Builder Schema::create('cineastas', function(Blueprint $table) { //Definimos las columnas $table->increments('id'); $table->string('nombre',255); $table->integer('edad'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('cineastas'); } }
Migración de películas:
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; use Illuminate\Support\Facades\DB; class CreatePeliculasTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('peliculas', function(Blueprint $table) { $table->increments('id'); $table->string('titulo',255); $table->mediumText('descripcion'); $table->integer('anio'); //Clave ajena $table->integer('cineasta_id')->unsigned(); $table->foreign('cineasta_id') ->references('id')->on('cineastas') ->onDelete('cascade'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('peliculas'); } }
Con esto ya tenemos las migraciones creadas y listas para usarse.
Lanzar migraciones
Ahora lanzamos el comando php artisan migrate
Ahora Laravel nos ha creado estas tablas en la base de datos.
Nos ha creado la tabla migrations.
Revertir migraciones
Ahora si queremos echar para atrás estos cambios en la base de datos necesitaremos ejecutar los comandos de rollback. Si ejecutamos un rollback y volvemos a la base de datos veremos que estará igual que la habíamos dejado antes de la migración.
Revertir los cambios de la última operación de migración:
php artisan migrate:rollback
Revierte todas las migraciones
php artisan migrate:reset
Revierte todas y vuelve a lanzarlas
php artisan migrate:refresh php artisan migrate:refresh --seed
Esto es todo lo que debemos saber para empezar a usar las migraciones en Laravel 5.
Más información:
http://laravel.com/docs/5.0/schema
http://laravel.com/docs/5.0/migrations