Laravel 5, parte 2: Migraciones

En la publicación pasada vimos cómo instalar Laravel e iniciar nuestra aplicación, de acá en adelante vamos a configurar nuestro proyecto, escribiendo algunas líneas por consola para crear nuestras migraciones, modelos, vistas, controladores y validaciones. Hoy veremos migraciones.

Migraciones

Las migraciones nos permitirán crear las entidades de la base de datos y tener una cantidad de versiones a lo largo que hagamos cambios en nuestras tablas.

Primero vamos a crear nuestra base de datos, yo voy a llamarle: «laravel_organizador».

Ahora abrimos nuestra consola, entramos en nuestro proyecto y escribimos lo siguiente:

php artisan make:migration create_estados_table

Y luego:

php artisan make:migration create_tareas_table

Con respecto a los usuarios, ya viene creada por defecto la migración de dicha tabla, así que vamos a usar ésa.

Si nos fijamos dentro de database/migrations, nos encontramos con las clases de nuestras migraciones, incluidas las dos que acabamos de crear.

Editamos la de «estados_table.php» y «tareas_table.php».

La relación entre estas tres será la siguiente, un usuario podrá crear una tarea con un estado: «Pendiente», «En proceso» o «Finalizada». Por lo cual una tarea será creada por un usuario, cada usuario puede crear varias tareas y cada tarea tendrá un solo estado, y estos estados podrán estar presentes en las distintas tareas.

Si vemos bien, en cada tabla tendremos dos métodos: «up()» y «down()». El primer se va a disparar cuando hagamos la migración para crear la tabla, y el segundo cuando se haga rollback (se descartarán los cambios hechos)

Así que en «estados_table.php» vamos a agregar el siguiente código:

public function up()
{
   Schema::create('estados', function(Blueprint $table){
      $table->increments('id');
      $table->string('nombre');
      $table->timestamps();
   });
}
public function down()
{
   Schema::dropIfExists('estados');
}

Y en «tareas_table.php»:

public function up()
{
   Schema::create('tareas', function(Blueprint $table){
      $table->increments('id');
      $table->string('titulo');
      $table->text('descripcion');
      $table->integer('user_id')->unsigned();
      $table->integer('estado_id')->unsigned();
      $table->foreign('user_id')->references('id')->on('users'); 
      $table->foreign('estado_id')->references('id')->on('estados');
      $table->timestamps();
   });
}
public function down()
{
   Schema::dropIfExists('tareas');
}

El código en ambos casos es igual, en los métodos «up()» creamos las columnas de la base de datos, mientras que en los métodos «down()» eliminamos las tablas.

El método create() va a recibir dos parámetros, el nombre de la table y un callback en donde vamos a indicar las columnas. En el caso de timestamps(), agregará dos columnas para tener un control de la fecha en que se inserta un registro y cuando se lo modifica.

Ahora bien, antes de crear las tablas, debemos escribir los datos correctos para que nuestra aplicación pueda conectarse la base de datos. Así que vamos al archivo: «.env», de la raíz de nuestro proyecto y buscamos las siguientes líneas:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

Y cambiamos los valores por los de nuestra conexión. Por ejemplo, en mi caso:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_organizador
DB_USERNAME=root
DB_PASSWORD=

Bien, a continuación escribimos en la consola lo siguiente:

php artisan migrate

Posible error:

Tal vez pueda pasarte como a mí, que te devuelva un error desde la consola:

"[Illuminate\Database\QueryException]
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQ
  L: alter table `users` add unique `users_email_unique`(`email`))"

Bueno, en este caso, podés ir a «app/Providers/AppServiceProvider.php». Editamos este archivo:

Arriba de todo incluimos la siguiente línea:

use Illuminate\Support\Facades\Schema;

Y modificamos el método boot, con el siguiente código:

public function boot()
{
   Schema::defaultStringLength(191);
}

En este caso, vamos a eliminar la base de datos, que acabamos de crear, y vamos a volver a crear una con el mismo nombre, y volver a escribir en la consola:

php artisan migrate

(Lo rojo realizarlo en caso de que al intentar hacer la migración, te devuelva un error)

Listo, ya tenemos nuestras tablas. Lo último que podemos hacer es crear a mano unos insert para los estados:

INSERT INTO estados(id, nombre)
VALUES
(1, 'Pendiente'),
(2, 'En proceso'),
(3, 'Finalizada')

Anterior: Laravel 5, parte 1: Instalación

Siguiente: Laravel 5, parte 3: Usuarios

 

Descargar ejemplo completo