Bases de datos: introducción
Introducción
Laravel puede usar SQL nativo, generador de consultas y Eloquent ORM para interactuar con la base de datos de manera muy simple en varios backends de bases de datos. Actualmente Laravel soporta cuatro bases de datos:
- mysql
- Postgres
- SQLite
- servidor SQL
Configuración
El archivo de configuración de la base de datos se coloca en config/database.php
el archivo donde puede definir todas las conexiones de la base de datos y especificar la conexión predeterminada que se utilizará. Este archivo proporciona ejemplos de la mayoría de las configuraciones de bases de datos admitidas por Laravel.
De forma predeterminada, la configuración del entorno de muestra de Laravel utiliza Laravel Homestead (esta es una pequeña máquina virtual que le permite desarrollar Laravel localmente fácilmente). Puede modificar esta configuración según las necesidades de su base de datos local.
configuración SQLite
touch database/database.sqlite
Después de crear una nueva base de datos SQLite usando un comando como este, puede configurar la variable de entorno para que apunte a la base de datos recién creada usando la ruta absoluta de la base de datos:
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
Conexiones de lectura y escritura
A veces desea que la declaración SELECT use una conexión de base de datos y las declaraciones INSERT, UPDATE y DELETE usen otra conexión de base de datos. Esto es pan comido en Laravel, ya sea que use consultas nativas, creadores de consultas o Eloquent ORM.
Para comprender cómo configurar la separación de lectura y escritura de la base de datos, veamos este ejemplo:
'mysql' => [
'read' => [
'host' => '192.168.1.1',
],
'write' => [
'host' => '196.168.1.2'
],
'sticky' => true,
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
],
Tenga en cuenta que en el ejemplo anterior, se agregaron 3 claves a la matriz de configuración read
: write
y sticky
. read
y write
ambos contienen una host
matriz con clave. read
Las otras write
configuraciones de base de datos de y están en la matriz principal con la clave mysql
:
Si desea anular un elemento de configuración en la matriz principal, simplemente colóquelo en la read
matriz write
and. Entonces, en este ejemplo: 192.168.1.1
se usará como host para conexiones de "lectura" y 192.168.1.2
como host para conexiones de "escritura". Las dos conexiones compartirán mysql
varias configuraciones de la matriz principal, como credenciales de base de datos, prefijos, codificación de caracteres, etc.
sticky
Opciones
sticky
es un valor opcional que se puede utilizar para leer inmediatamente los registros que se han escrito en la base de datos durante el ciclo de solicitud actual. Si sticky
está habilitado y se ha realizado una operación de "escritura" durante el ciclo de solicitud actual, cualquier operación de "lectura" utilizará la conexión de "escritura". Esto garantiza que los datos escritos en el mismo ciclo se puedan leer inmediatamente en el mismo ciclo. Si está habilitado o no depende de las necesidades de la aplicación.
Utilice múltiples conexiones de bases de datos
Cuando utilice varias conexiones de bases de datos, puede acceder a cada conexión a través DB
del método de fachada . connection
Al pasarlo name
como connection
parámetro al método, puedes usar config/database.php
la conexión con el nombre correspondiente en el archivo de configuración:
$users = DB::connection('foo')->select(...);
También puede acceder a la instancia de PDO subyacente utilizando métodos en una instancia conectada getPdo
:
$pdo = DB::connection()->getPdo();
Ejecute consultas SQL nativas
Después de configurar la conexión de la base de datos, puede usar DB
Facade para ejecutar consultas. DB
Facade proporciona métodos para cada tipo de consulta : select
, update
, y .insert
delete
statement
Ejecutar consulta de selección
Puede utilizar métodos DB
de Facade para ejecutar consultas básicas:select
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 显示所有应用程序的用户列表
*
* @return Response
*/
public function index()
{
$users = DB::select('select * from users where active = ?', [1]);
return view('user.index', ['users' => $users]);
}
}
El primer parámetro pasado al select
método es una consulta SQL nativa y el segundo parámetro es el valor del parámetro que debe vincularse a la consulta. Normalmente, estos valores se utilizan en where
declaraciones de restricciones. El enlace de parámetros se utiliza para evitar la inyección de SQL.
select
El método siempre devolverá una matriz, cada resultado de la matriz es un StdClass
objeto y se puede acceder al valor del resultado como se muestra a continuación
foreach ($users as $user) {
echo $user->name;
}
Usar enlaces con nombre
Además de utilizar ?
para representar enlaces de parámetros, también puede utilizar enlaces con nombre para ejecutar una consulta:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
Ejecutar declaración de inserción
Puede utilizar métodos DB
de Facade insert
para ejecutar insert
declaraciones. Al igual que select
con , este método toma la consulta SQL nativa como primer parámetro y los datos vinculados como segundo parámetro:
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
Ejecutar declaración de actualización
update
El método se utiliza para actualizar registros existentes en la base de datos. Este método devuelve el número de filas afectadas por la declaración:
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
Ejecutar declaración de eliminación
delete
El método se utiliza para eliminar registros de la base de datos. Como update
en, devuelve el número de filas afectadas por la declaración:
$deleted = DB::delete('delete from users');
Ejecutar declaraciones ordinarias
Algunas declaraciones de la base de datos no devolverán ningún valor. Para estas declaraciones, puede utilizar DB
el statement
método Facade para ejecutar:
DB::statement('drop table users');
Escuche los eventos de consulta
Si desea monitorear cada consulta SQL ejecutada por su programa, puede usar listen
el método. Este método es útil para registrar consultas o depurar. Puede registrar su oyente de consultas con el proveedor de servicios :
<?php
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 启动应用服务
*
* @return void
*/
public function boot()
{
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
/**
* 注册服务提供器
*
* @return void
*/
public function register()
{
//
}
}
transacción de base de datos
Puede utilizar métodos DB
de fachada para ejecutar un conjunto de operaciones dentro de una transacción de base de datos. transaction
Si Closure
ocurre una excepción durante la transacción, la transacción se revertirá. Si Closure
la ejecución es exitosa, la transacción se confirmará automáticamente. No necesita preocuparse por transaction
revertir o confirmar manualmente cuando utiliza métodos:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
Manejar punto muerto
transaction
El método acepta un segundo parámetro opcional, que indica el número de reintentos cuando la transacción se bloquea. Una vez agotados estos intentos, se lanza una excepción:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
Usar transacciones manualmente
Si desea iniciar una transacción manualmente y tener control total sobre la reversión y la confirmación, puede DB
utilizar beginTransaction
métodos en la fachada:
DB::beginTransaction();
Puede rollBack
revertir una transacción utilizando el método:
DB::rollBack();
Finalmente, puedes commit
confirmar la transacción usando el método:
DB::commit();
{tip}
DB
Los métodos de transacción de la fachada también se aplican al generador de consultas y a Eloquent ORM .