Bases de datos en Laravel

Las Bases de datos en Laravel son muy importantes, de lo contrario solo tendríamos un gestor de plantillas estáticas muy pesado, y aunque pudiéramos incluir conexiones normales por medio de PHP a las BBDD no sería interesante.

Es por ello que Laravel incluye potentes herramientas para trabajar con nuestros datos de forma bastante sencilla una vez se ha entendido, y ya sabéis que pienso que el corazón de una buena aplicación web es su base de datos, por que si esta no está bien realizada puede hacer que un proyecto por otros lados perfecto (por ejemplo el front end), caiga en desgracía, y de eso por desgracia se muy bien de lo que hablo, al haber heredado ciertos proyectos en Laravel con bases de datos incongruentes, con tablas sin ids, redundantes…

Estas son las razones por las que vamos a estudiar la forma de trabajar con bases de datos en Laravel, de modo que empecemos a ello.

Configuración  de la BBDD en Laravel

Laravel puede trabajar en diversas bases de datos; MySQL, Postgres, SQLite, SQL server… pero nosotros vamos a tomar MySQL, pero los ejemplos son extrapolables.

Para configurar la base de datos podemos ir al archivo config/databse.php.

En ella tenemos varios bloques con comentarios explicativos, pero a nosotros nos interesa el apartado default, el cual le dice a Laravel el tipo de base de datos con el que vamos a trabajar:

'default' => env('DB_CONNECTION', 'mysql'),

De modo predeterminado es MySQL.

Y en segundo lugar, conections, donde hay que incluir las credenciales de nuestra BBDD, y vemos que la configuración es recuperada del archivo env por medio de la funcion env()

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],

Esta función funciona como ya hemos dicho, recuperando el valor del archivo .env, pero si no existe o no puede recuperarlo toma el valor que hay en el segundo parámetro, por lo que podemos configurar la base de datos tanto desde el archivo .env como desde aquí.

El bloque de conexión en el archivo  .env sería el siguiente:

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

Crear Schemas con Migrations

Para crear el schema de la base de datos siempre es recomendable usar migrations.

Por medio de artisan podemos generar nuestras tablas generando nuestros archivos migrations, para ello nos vamos a la consola y nos posicionamos en el directorio raíz de nuestro laravel y ejecutamos la siguiente orden.

php artisan make:migration create_tickets_table

Esto nos tiene que dar un resultado similar a:

Y nos informa que Laravel ha creado una plantilla migrations, dentro de nuestro directorio database/migrations

En esta plantilla vemos que existen dos métodos:

  • up: Es el que tenemos que se utiliza para añadir columnas a las tablas de la BBDD
  • downn: Sirve para revertir lo que se haya hecho.

De este modo podemos ver como en up hay una clase llamada Schema que se utiliza para definir y manipular las tablas. De hecho al haber utilizado el comando –create al crear la plantilla, ya aparece con un metodo llamado Schema::create que tiene dos párametros:

  • El nombre de la tabla
  • El segundo es clousure que sirve para crear campos en la tabla

Aquí vemos que los campos de la tabla básica que crea tienen dos propiedades:

  • increments: que sirve para marcar el campo como indice autoincrementable
  • timestamps: que crea los dos campos que utiliza laravel para controlar los registros en la BBDD (created_at y updated_at)

Hay muchos mas tipos de entradas que podemos ver en la documentación oficial.

Nosotros siguiendo el tutorial de Jesus Conde, vamos a hacer una tabla que tenga:

  • id
  • titulo
  • contenido
  • slug (version url amigable)
  • status estatus actual del mensaje (pendiente o contestado)
  • id_usuario quien ha creado el ticket

De este modo así quedaría nuestra función donde hemos definido nuestras columnas, y donde vemos como se definen algunos tipos de campos:

Schema::create('mensajes', function (Blueprint $table) {
    $table->increments('id');
    $table->string('titulo', 255);
    $table->text('contenido');
    $table->string('slug')->nullable();
    $table->tinyInteger('status')->default(1);
    $table->integer('id_usuario')->nullable();
    $table->timestamps();
});

Pero aun no tenemos la tabla creada en nuestra Base de datos, para ello tenemos que utilizar artisan, de modo que de nuevo en el directorio raíz de nuestro proyecto ejecutamos la siguiente sentencia:

php artisan migrate

Este comando ejecuta todas las migraciones que haya en nuestro sistema y crea las tablas, junto con una tabla migrations que controla las migraciones que se van creando.

De hecho al hacer la migración por primera vez Laravel también crea las tablas discussions, password_resets y users por defecto.

Con esto ya podemos ir viendo como van a funcionar las migraciones y las bases de datos en laravel para hacernos la idea sobre como hacer que nuestros sistemas creen por si mismos las base de datos.