Database: Empezando

# Introduccion

Laravel hace que la interacción con las bases de datos sea extremadamente simple a través de una variedad de backends de bases de datos utilizando ya sea el SQL en bruto, el fluent query builder, y el Eloquent ORM. Actualmente, Laravel soporta cuatro bases de datos:

Configuración

La configuración de la base de datos de su aplicación se encuentra en config/database.php. En este archivo puede definir todas las conexiones de su base de datos, así como especificar qué conexión debe utilizarse por defecto. En este archivo se proporcionan ejemplos de la mayoría de los sistemas de bases de datos soportados.

Por defecto, la muestra del environment configuration de Laravel está lista para ser utilizada con Laravel Homestead, que es una máquina virtual conveniente para hacer el desarrollo de Laravel en su máquina local. Es libre de modificar esta configuración según sea necesario para su base de datos local.

Configuración SQLite

Después de crear una nueva base de datos SQLite utilizando un comando como touch database/database.sqlite, puede configurar fácilmente sus variables de entorno para que apunten a esta base de datos recién creada utilizando la ruta absoluta de la base de datos:

DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite

Para habilitar las restricciones de claves externas para las conexiones SQLite, debe establecer la variable de entorno DB_FOREIGN_KEYS en true:

DB_FOREIGN_KEYS=true

Configuración usando URLs

Normalmente, las conexiones de la base de datos se configuran utilizando múltiples valores de configuración como host, database, username, password, etc. Cada uno de estos valores de configuración tiene su propia variable de entorno correspondiente. Esto significa que al configurar la información de la conexión de la base de datos en un servidor de producción, es necesario gestionar varias variables de entorno.

Algunos proveedores de bases de datos administradas, como Heroku, proporcionan una única "dirección URL" de la base de datos que contiene toda la información de conexión de la base de datos en una sola cadena. Un ejemplo de URL de una base de datos puede ser algo parecido a lo siguiente:

mysql://root:password@127.0.0.1/forge?charset=UTF-8

Estas URLs típicamente siguen una convención de esquema estándar:

driver://username:password@host:port/database?options

Para mayor comodidad, Laravel soporta estas URL como una alternativa a la configuración de su base de datos con múltiples opciones de configuración. Si la opción de configuración de url (o la correspondiente variable de entorno DATABASE_URL) está presente, se utilizará para extraer la información de conexión y credenciales de la base de datos.

Leer y escribir conexiones

A veces, puede que desee utilizar una conexión de base de datos para las declaraciones SELECT, y otra para INSERTAR, ACTUALIZAR y BORRAR declaraciones. Laravel hace que esto sea pan comido, y las conexiones apropiadas siempre se usarán tanto si se usan consultas en bruto, el constructor de consultas, o el ORM elocuente.

Para ver cómo se deben configurar las conexiones de lectura/escritura, veamos este ejemplo:

'mysql' => [
    'read' => [
        'host' => [
            '192.168.1.1',
            '196.168.1.2',
        ],
    ],
    'write' => [
        'host' => [
            '196.168.1.3',
        ],
    ],
    'sticky' => true,
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
],

Note que se han añadido tres claves a la matriz de configuración: read, write y sticky. Las claves read y write tienen valores de matriz que contienen una única key: host. El resto de las opciones de la base de datos para las conexiones de lectura read y write se fusionarán desde la matriz principal de mysql.

Sólo tienes que colocar los elementos en las matrices de readywrite si deseas anular los valores de la matriz principal. Así, en este caso, 192.168.1.1 se utilizará como host para la conexión de "read" mientras que 192.168.1.3 e utilizará para la conexión de "escritura". Las credenciales de la base de datos, el prefijo, el juego de caracteres y todas las demás opciones de la matriz principal de mysql se compartirán entre ambas conexiones.

La opción sticky

La opción sticky es un valor opcional que puede utilizarse para permitir la lectura inmediata de los registros que se han escrito en la base de datos durante el ciclo de solicitud actual. Si la opcióne stickyestá activada y se ha realizado una operación de "escritura" contra la base de datos durante el ciclo de solicitud actual, cualquier otra operación de "lectura" utilizará la conexión de "escritura". Esto garantiza que cualquier dato escrito durante el ciclo de solicitud pueda ser leído inmediatamente de la base de datos durante esa misma solicitud. Depende de usted decidir si este es el comportamiento deseado para su solicitud.

Usando múltiples conexiones de bases de datos

Cuando se utilizan varias conexiones, se puede acceder a cada una de ellas a través del método connection de la facade DB. El name pasado al método connection debe corresponder a una de las conexiones listadas en su archivo de configuración config/database.php:

$users = DB::connection('foo')->select(...);

También puede acceder a la instancia de PDO sin procesar y subyacente utilizando el método getPdo en una instancia de conexión:

$pdo = DB::connection()->getPdo();

# Ejecutando consultas SQL sin procesar

Una vez que haya configurado su conexión a la base de datos, podrá realizar consultas utilizando la fachada DB. La fachada DB proporciona métodos para cada tipo de consulta: select, update, insert, delete, y statement.

Ejecutando una consulta selectiva

Para realizar una consulta básica, puede utilizar el métod select de la fachada DB:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;

class UserController extends Controller
{
    /**
     * Show a list of all of the application's users.
     *
     * @return Response
     */
    public function index()
    {
        $users = DB::select('select * from users where active = ?', [1]);

        return view('user.index', ['users' => $users]);
    }
}

El primer argumento que se pasa al método select is the raw SQL query, mientras que el segundo argumento es cualquier parámetro que deba vincularse a la consulta. Típicamente, estos son los valores de las restricciones de la cláusula where. La vinculación de parámetros proporciona protección contra la inyección SQL.

El método select siempre devolverá un array de resultados. Cada resultado dentro de la matriz será un objeto PHP stdClass, que le permitirá acceder a los valores de los resultados:

foreach ($users as $user) {
    echo $user->name;
}

Usando ataduras con nombre

En lugar de usar ? para representar sus enlaces de parámetros, puede ejecutar una consulta usando enlaces con nombre:

$results = DB::select('select * from users where id = :id', ['id' => 1]);

Ejecutar una declaración de inserción

Para ejecutar una declaración insert, puede utilizar el método insert de la fachada DB. Al igual que select, este método toma la consulta SQL sin procesar como primer argumento y los enlaces como segundo argumento:

DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);

Ejecutar una declaración de actualización

El método update debe utilizarse para actualizar los registros existentes en la base de datos. Se devolverá el número de filas afectadas por la declaración:

$affected = DB::update('update users set votes = 100 where name = ?', ['John']);

Ejecutar una declaración de eliminación

El método delete debe utilizarse para eliminar los registros de la base de datos. Al igual que update, el número de filas afectadas será devuelto:

$deleted = DB::delete('delete from users');

Ejecutar una declaración general

Algunas declaraciones de la base de datos no devuelven ningún valor. Para este tipo de operaciones, se puede utilizar el método de declaración en la fachada de la base de datos:

DB::statement('drop table users');

# Escuchar los eventos de consulta

Si desea recibir cada consulta SQL ejecutada por su aplicación, puede utilizar el método listen. Este método es útil para registrar las consultas o la depuración. Puede registrar a su oyente de consultas en un service provider:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function ($query) {
            // $query->sql
            // $query->bindings
            // $query->time
        });
    }
}

# Transacciones de la base de datos

Puede utilizar el método transaction de la fachada DB para ejecutar un conjunto de operaciones dentro de una transacción de la base de datos. Si se lanza una excepción dentro de la transacción Closure, la transacción será automáticamente retrocedida. Si la Closure se ejecuta con éxito,la transacción será comprometida automáticamente. No tiene que preocuparse de retroceder manualmente o de comprometerse mientras utiliza el método transaction:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});

Manejar los puntos muertos

El método transaction acepta un segundo argumento opcional que define el número de veces que se debe volver a intentar una transacción cuando se produce un bloqueo. Una vez agotados estos intentos, se lanzará una excepción:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
}, 5);

Uso manual de las transacciones

Si desea iniciar una transacción manualmente y tener un control completo sobre los rollbacks y los commits, puede utilizar el método beginTransaction de la fachada DB:

DB::beginTransaction();

Puede anular la transacción mediante el método rollBack:

DB::rollBack();

Por último, puede confirmar una transacción mediante el método commit:

DB::commit();

The DB facade's transaction methods control the transactions for both the query builder and Eloquent ORM.