Laravel provee un sistema llamado "migraciones" que permite elaborar la estructura de la base de datos de un modo paulatino.
Las migraciones se asemejan a un control de versiones para la base de datos. Cada migración puede desplegarse o deshacerse según se precise.
Facilitan enormemente el trabajo en equipo y mediante SCV (git u otro).
Facilitan la migración de SGBD (Mysql, PostGres, ...).
Facilitan la implantación en nuevos equipos de desarrollo o en producción.
Debemos crear una migración por cada tabla.
Debemos crearla con artisan y editarla después.
Comandos
Hay 6 comandos:
fresh : elimine todas las tablas y reinicie la migración
install : crea e informa la tabla de referencia de migraciones
refresh : restablece y reinicia las migraciones
rollback : cancela la última migración
status : da información sobre migraciones.
Instalación
Si miras en la base de datos/ carpeta de migraciones ya hay 4 migraciones presentes:
tabla de users : esta es una migración básica para crear una tabla de usuarios,
tabla password_resets : se trata de una migración vinculada a la anterior que permite gestionar la renovación de contraseñas con total seguridad,
tabla failed_jobs: una migración que se refiere a las colas,
La tabla personal_access_tokens es para las API.
Creación BD
Comience creando una base de datos MySQL e informe .env , por ejemplo:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nombrebasededatos
DB_USERNAME=root
DB_PASSWORD=
Luego ejecute el comando de instalación :
Podemos crearla a la vez que el modelo:
//crear migración
php artisan make:migration create_studies_table
//crear modelo y migración en un comando
php artisan make:model Study-m
Luego terminamos con una tabla de migraciones en la base de datos con esta estructura:
Por el momento esta tabla está vacía, se rellenará sobre las migraciones para guardarlas en memoria.
Constitución de una migración
Si abre el archivo base de database/migrations/2014_10_12_000000_create_users_table.php encontrará este código:
El resultado es una clase hija guardada database/migrations
El fichero se nombra usando el timestamp de creación para que sea ejecutado en el orden correcto.
Hay dos funciones en esta clase:
up() sirve para modificar la base de datos. Típicamente crear una tabla.
down() sirve para devolver la base de datos a su estado previo. Típicamente borrar una tabla.
Iniciar migraciones
Iniciar migraciones
Para iniciar las migraciones, use el comando de migración :
Vemos que se han ejecutado las 4 migraciones presentes y encontramos las 4 tablas en la base de datos (además de la tabla de gestión de migraciones):
Para comprender el vínculo entre la migración y la creación de la tabla asociada, aquí hay una ilustración de la tabla de usuarios :
El método timestamp permite la creación de las dos columnas created_at y updated_at .
Cancelar o actualizar una migración
Para cancelar una migración, use el comando rollback :
Se ejecutan los métodos down de las migraciones y se descartan las tablas.
Para cancelar y reiniciar en una sola operación, use el comando refresh :
Para evitar tener que codificar el método down , tenemos el comando fresh que elimina automáticamente las tablas en cuestión:
Crear una migración
Hay un comando artesanal para crear un esqueleto de migración:
La migración se crea en la carpeta:
Con este código básico:
El nombre del archivo de migración comienza con su fecha de creación, lo que determina su posición en la lista. ¡El elemento importante a tener en cuenta es que el orden de las migraciones cobra gran importancia cuando se tienen claves foráneas!
Código de las migraciones
Vemos cómo se crean los campos. Los tipos string, laravel los convierte a Varchar2.
id es de tipo autoincremento
timestamps, básicamente lo que hace ese método es crear dos campos llamados created_at y otro updated_at.
Estos campos son de tipo TIMESTAMP. Nos informarán de cuándo fue creado o modificado cada uno de los registros de nuestra tabla.
Tipos de datos
A la hora de crear las tablas tenemos disponibles los tipos de datos que hay en sql
Crear las tablas con campos especificados (método create)
Schema::create('usuarios',function($tabla)
{
$tabla->increments('id');//Campo autoincrementto
$tabla->string('nombre',50);//String
$tabla->string('email',100)->unique();
$tabla->string('password',200);
$tabla->string('direccion',200);
$tabla->timestamps();//Crea los campos update_up y current_up de tipo '''''timestamp'''''
});
Para ver los métodos para especificar los tipos campos de la base de datos consultar a la web de referencia.
Borrar la tabla, método drop
Schema::drop('nombreTabla');
Schema::dropIfExists('users');
Cambiar el nombre de una tabla, método rename
Schema::rename('nombreAntiguo','nombreNuevo);
Cambiar el nombre de un campo de una tabla, método rename
Schema::rename('nombreAntiguo','nombreNuevo);
Añadir un campo en la tabla método table
Schema::table('nombreTabla',function($table)
{
$table->string('email');
});
Añadir restricciones
1.- clave primaria
$table->primary('id');//Clave principal id
$table->primary(array('first','last'));//Clave principal compuesta
1.- clave candidata o valor único
$table->unique('email');
1.- índice
$table->index('codigo'); Agregar un índice básico
En las funciones anónimas (closure) de creación y modificación podemos hacer prácticamente cualquier cosa que soporte SQL. Debemos usar los métodos de la clase Blueprint aplicados a la variable $table:
$table->string('email'); //añadir columna de texto VARCHAR(100). Hay métodos para muchos tipos de datos. Ver documentación.
$table->string('name', 20);
$table->tinyInteger('numbers');
$table->float('amount');
$table->double('column', 15, 8);
$table->integer('votes');
//podemos añadir modificadores e índices:
$table->id(); //Clave principal, autoincremental, big integer.
$table->char('codigo', 25)->primary(); //Otras claves principales
$table->primary(['area', 'bloque']); // o así...
$table->string('email')->nullable(); //añadir columna y permitir nulos.
->first() | Place the column “first” in the table (MySQL Only)
->after('column') | Place the column “after” another column (MySQL Only)
->nullable() | Allow NULL values to be inserted into the column
->default($value) | Specify a “default” value for the column
->unsigned() | Set integer columns to UNSIGNED
->comment('my comment') | Add a comment to a column
Para otras operaciones consultar la documentación oficial.
Ejecutar migraciones
Las migraciones se gestionan desde la consola mediante comandos de artisan.
El comando base es php artisan migrate. En los siguientes apartados vamos a ver las variantes.
//Crea una tabla en la base de datos que sirve para llevar el control de las migraciones realizadas y su orden.
migrate:install
//Realiza una marcha atrás de todas las migraciones en el sistema, volviendo el schema de la base de datos al estado inicial.
migrate:reset
//Vuelve atrás el sistema de migraciones y las vuelve a ejecutar todas.
migrate:refresh
//Vuelve hacia atrás el último lote de migraciones ejecutadas.
migrate:rollback
* \ //Vuelve atrás las últimas migraciones, en este ccaso los últimos dos lotes.
php artisan migrate:rollback --step=2
//Te informa de las migraciones presentes en el sistema y si están ejecutadas o no.
migrate:status
NOTA:
Las migraciones se realizan en orden alfabético, lo que puede generar un problema con las claves externas. Si la tabla a la que se hace referencia se crea después, nos encontraremos con un error .
Podemos desactivar temporalmente el control referencial mientras crea las tablas, agregando esta línea en la migración:
Schema::disableForeignKeyConstraints () ;
EJEMPLO
Cómo trabajar con claves, primarias, foráneas, así como índices al escribir las migraciones para definición de la base de datos en Laravel.