Laravel 6.*

Laravel incluye un sistema de migraciones de base de datos con el cual podemos definir todas las tablas de nuestra aplicación desde PHP, utilizando una interfaz orientada a objetos. Este sistema nos da la ventaja de que podemos guardar las diferentes «versiones» de nuestra base de datos como código dentro del sistema de control de versiones (por ejemplo git), además nos permite generar tablas para diferentes bases de datos (MySQL, PostgreSQL, SQLite, y SQL Server) usando el mismo código PHP.

En esta lección aprenderás cómo generar, modificar y ejecutar una migración para crear tu primera tabla con Laravel.

Mira el código en GitHub: actual, resultado, comparación.

Las migraciones de Laravel no son más que archivos de PHP ubicados en el directorio database/migrations. Tu aplicación viene con 3 migraciones por defecto, las cuales puedes modificar o eliminar.

La primera migración trae lo necesario para crear la tabla donde se guardará la información de cada usuario incluyendo su email y contraseña. La segunda es la migración que utiliza Laravel para guardar la información para la recuperación de contraseñas y la tercera es un poco más avanzada y la veremos luego.

También podemos generar una nueva migración desde la consola con el comando php artisan make:migration seguido del nombre de la migración, por ejemplo:

#
php artisan make:migration create_notes_table

El nombre create_notes_table es una convención: create_[NOMBRE DE LA TABLA AQUÍ]_table, Laravel comprende esto y nos genera el boilerplate necesario para definir nuestra nueva tabla de notas:

<?php

//...

class CreateNotesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('notes', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('notes');
    }
}

Nota que hay dos métodos: up y down:

  • Desde el método up definiremos la acción principal de nuestra migración, que en este caso es la creación de la tabla notas
  • En el método down definiremos la acción contraria, en este caso la eliminación de la tabla de notas. Este método es opcional.

No todo el tiempo el método up se encargará de crear tablas. Si agregas una migración para eliminar una tabla las acciones deberían quedar al revés: en up tendrías que eliminar la tabla y en down recrearla tal como estaba antes de su eliminación.

Exploremos el código del método up a detalle:

<?php

    //...
    public function up()
    {
        Schema::create('notes', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

Aquí se llama al método create dentro del «Facade» Schema.

Recuerda que los Facades en Laravel nos permiten interactuar con componentes registrados en el framework a través de una interfaz estática; pero realmente no hay un método create dentro de esta clase Schema. Más adelante exploraremos este concepto con calma.

Este método create acepta 2 argumentos, el primero es el nombre de la tabla que será creada, el segundo es una función anónima o Closure:

<?php

function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->timestamps();
}

Esta función anónima va a recibir un objeto de la clase Illuminate\Database\Schema\Blueprint y es este último objeto el que contiene los métodos para definir los campos de la tabla, por ejemplo:

  • $table->bigIncrements('id'); define una columna de tipo BIGINT UNSIGNED, es decir, entero grande sin números negativos.
  • $table->timestamps(); define 2 columnas de tipo TIMESTAMP con los nombres created_at y updated_at, estas columnas son usadas por Eloquent, el ORM de Laravel que veremos más adelante.

Vamos a agregar 2 columnas más en el medio:

  • $table->string('title'); define una columna de tipo VARCHAR con el nombre title
  • $table->mediumText('content'); define una columna de tipo MEDIUMTEXT con el nombre content

Por ahora esto es todo lo que necesitamos para crear la versión inicial de nuestra tabla de notas.

Aprende más sobre bases de datos y SQL con nuestro libro digital disponible en Leanpub con 40% de descuento.

Ver más

Antes de ejecutar nuestras migraciones debemos crear una base de datos y configurar el archivo .env en el directorio principal de nuestro proyecto.

  1. Puedes crear una base de datos utilizando tu administrador de DB preferido, ya yo he creado una llamada curso_laravel_styde
  2. A continuación, debes abrir el archivo .env en el directorio principal de tu proyecto y asegurarte de configurar los siguientes valores (es posible que algunos de los valores por defecto sean los correctos):
    • DB_CONNECTION
    • DB_HOST
    • DB_PORT
    • DB_DATABASE
    • DB_USERNAME
    • DB_PASSWORD

Una vez creada y configurada la DB, ejecuta el comando php artisan migrate en la consola. Deberías ver los siguientes mensajes:

php artisan migrate

Solamente falta que revises las tablas creadas en tu administrador de base de datos favorito, yo uso phpMyAdmin en mis cursos porque es bastante común y está disponible desde cualquier navegador:

Tablas creadas con la migración de Laravel

Problemas comunes al ejecutar las migraciones

Si recibes un error y no se ha creado ninguna tabla, es posible que no hayas configurado tu base de datos correctamente. En dado caso regresa al archivo .env y arregla los valores.

Si el error ocurrió luego de que se creara al menos una de las tablas es posible que hayas definido una migración incorrectamente. Arregla el código y luego re-ejecuta el comando php artisan migrate.

Alternativamente puedes ejecutar php artisan migrate:fresh para borrar todas las tablas y ejecutar las migraciones de nuevo y desde cero.

Debes tener cuidado con comandos como php artisan migrate:fresh que ejecutan acciones destructivas como eliminar todas las tablas de tu base de datos, este comando en particular es bastante útil en desarrollo pero sería desastroso ejecutarlo en un servidor de producción.

Cómo revertir las migraciones ejecutadas

Por último, puedes ejecutar el comando php artisan migrate:rollback para revertir las migraciones. Este comando ejecutará todos los métodos down de cada migración en el orden inverso en el que fueron ejecutadas previamente. En nuestro ejemplo deberás ver cómo se eliminan las tablas creadas previamente; a excepción de la tabla migrations que Laravel utiliza para llevar el control de las migraciones que ya han sido ejecutadas y el orden en que fueron ejecutadas.

Si deseas usar el comando migrate:rollback, asegúrate de agregar la lógica para revertir la migración en el método down().

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Generar URLs con Laravel 6 Lección siguiente Insertar datos en la base de datos con los Seeders de Laravel