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.