• Introducción

    • Configuración
    • Conexiones de lectura y escritura
    • Uso de múltiples conexiones de bases de datos
  • Ejecución de consultas SQL sin formato
  • Escuchar eventos de consulta
  • Transacciones de base de datos

Introducción

Laravel hace que la interacción con bases de datos sea extremadamente simple en una variedad de backends de bases de datos utilizando SQL sin procesar, el generador de consultas fluido y el ORM Eloquent. Actualmente, Laravel admite cuatro bases de datos:

Configuración

La configuración de la base de datos para 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 usarse de forma predeterminada. En este archivo se proporcionan ejemplos para la mayoría de los sistemas de bases de datos compatibles.

De forma predeterminada, la configuración del entorno de muestra de Laravel está lista para usar con Laravel Homestead, que es una máquina virtual conveniente para realizar el desarrollo de Laravel en su máquina local. Puede modificar esta configuración según sea necesario para su base de datos local.

Configuración de SQLite

Después de crear una nueva base de datos SQLite usando 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 restricciones de clave externa para conexiones SQLite, debe establecer el DB_FOREIGN_KEYS variable de entorno a true:

DB_FOREIGN_KEYS=true

Configuración mediante URL

Normalmente, las conexiones de la base de datos se configuran utilizando varios 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 conexión de su base de datos en un servidor de producción, debe administrar varias variables de entorno.

Algunos proveedores de bases de datos administradas, como Heroku, proporcionan una única “URL” de base de datos que contiene toda la información de conexión para la base de datos en una sola cadena. Una URL de base de datos de ejemplo puede tener un aspecto similar al siguiente:

mysql://root:[email protected]/forge?charset=UTF-8

Estas URL suelen seguir una convención de esquema estándar:

driver://username:[email protected]:port/database?options

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

Conexiones de lectura y escritura

A veces, es posible que desee utilizar una conexión de base de datos para las sentencias SELECT y otra para las sentencias INSERT, UPDATE y DELETE. Laravel hace que esto sea muy sencillo, y siempre se utilizarán las conexiones adecuadas, ya sea que esté utilizando consultas sin formato, el generador de consultas o el ORM de Eloquent.

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' => '',
],

Tenga en cuenta que se han agregado tres claves a la matriz de configuración: read, write y sticky. los read y write las claves tienen valores de matriz que contienen una sola clave: host. El resto de las opciones de la base de datos para read y write las conexiones se fusionarán desde la principal mysql formación.

Solo necesita colocar elementos en el read y write matrices si desea anular los valores de la matriz principal. Entonces, en este caso, 192.168.1.1 se utilizará como host para la conexión de “lectura”, mientras que 192.168.1.3 se 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 mysql La matriz se compartirá entre ambas conexiones.

los sticky Opción

los sticky la opción es una Opcional valor que se puede utilizar para permitir la lectura inmediata de registros que se han escrito en la base de datos durante el ciclo de solicitud actual. Si el sticky La opción está habilitada y se ha realizado una operación de “escritura” en la base de datos durante el ciclo de solicitud actual, cualquier otra operación de “lectura” utilizará la conexión de “escritura”. Esto asegura que cualquier dato escrito durante el ciclo de solicitud pueda leerse inmediatamente desde la base de datos durante esa misma solicitud. Depende de usted decidir si este es el comportamiento deseado para su aplicación.

Uso de múltiples conexiones de bases de datos

Cuando utilice varias conexiones, puede acceder a cada conexión a través del connection método en el DB fachada. los name pasó a la connection El método debe corresponder a una de las conexiones enumeradas en su config/database.php archivo de configuración:

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

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

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

Ejecución de consultas SQL sin formato

Una vez que haya configurado su conexión a la base de datos, puede ejecutar consultas usando el DB fachada. los DB fachada proporciona métodos para cada tipo de consulta: select, update, insert, delete, y statement.

Ejecución de una consulta de selección

Para ejecutar una consulta básica, puede utilizar el select método en el DB fachada:

<?php

namespace AppHttpControllers;

use AppHttpControllersController;
use IlluminateSupportFacadesDB;

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 pasado al select El método es la consulta SQL sin formato, mientras que el segundo argumento es cualquier enlace de parámetro que deba vincularse a la consulta. Normalmente, estos son los valores de la where restricciones de la cláusula. El enlace de parámetros proporciona protección contra la inyección de SQL.

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

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

Usar enlaces con nombre

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

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

Ejecución de una declaración de inserción

Para ejecutar un insert declaración, puede utilizar la insert método en el DB fachada. Igual que select, este método toma la consulta SQL sin formato como primer argumento y los enlaces como segundo argumento:

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

Ejecución de una declaración de actualización

los update Se debe utilizar este método 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']);

Ejecución de una declaración de eliminación

los delete Se debe utilizar este método para eliminar registros de la base de datos. Igual que update, se devolverá el número de filas afectadas:

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

Ejecución de una declaración general

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

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

Escuchar eventos de consulta

Si desea recibir cada consulta SQL ejecutada por su aplicación, puede usar el listen método. Este método es útil para registrar consultas o depurar. Puede registrar su escucha de consultas en un proveedor de servicios:

<?php

namespace AppProviders;

use IlluminateSupportFacadesDB;
use IlluminateSupportServiceProvider;

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 base de datos

Puede utilizar el transaction método en el DB fachada para ejecutar un conjunto de operaciones dentro de una transacción de base de datos. Si se lanza una excepción dentro de la transacción Closure, la transacción se revertirá automáticamente. Si el Closure se ejecuta correctamente, la transacción se confirmará automáticamente. No necesita preocuparse por retroceder o comprometerse manualmente mientras usa el transaction método:

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

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

Manejo de interbloqueos

los transaction El método 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 punto muerto. Una vez que se hayan agotado estos intentos, se lanzará una excepción:

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

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

Uso manual de transacciones

Si desea comenzar una transacción manualmente y tener un control completo sobre las reversiones y confirmaciones, puede usar el beginTransaction método en el DB fachada:

DB::beginTransaction();

Puede revertir la transacción a través del rollBack método:

DB::rollBack();

Por último, puede confirmar una transacción a través del commit método:

DB::commit();

los DB Los métodos de transacción de fachada controlan las transacciones tanto para el generador de consultas como para Eloquent ORM.