Основы работы с базой данных
- Настройка
- Раздельное чтение и запись
- Выполнение запросов
- Транзакции
- Доступ к соединениям
- Журнал запросов
Настройка
Laravel делает процесс соединенеия с БД и выполнение запросов очень простым. Настройки работы с БД хранятся в файле config/database.php
. Здесь вы можете указать все используемые вами соединения к БД, а также указать, какое из них будет использоваться по умолчанию. Примеры настройки всех возможных видов подключений находятся в этом же файле.
На данный момент Laravel поддерживает 4 СУБД: MySQL, Postgres, SQLite и SQL Server.
Раздельное чтение и запись
Возможно, иногда вам понадобится использовать одно соединения для выполнения запроса SELECT, а другое для запросов INSERT, UPDATE и DELETE. Laravel максимально упрощает этот процесс, причем не важно, что вы используете - сырые запросы, например DB::select()
, Query Builder или Eloquent ORM.
Рассмотрим пример конфигурации:
'mysql' => [
'read' => [
'host' => '192.168.1.1',
],
'write' => [
'host' => '196.168.1.2'
],
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
],
Заметьте, два ключа были добавлены в массив настроек: read
и write
. Оба из них содержат единственный ключ: host
. Остальные настройки для обеих этих операций одинаковы и берутся из массива mysql
. При необходимости изменения и других настроек (не только host
), просто добавьте и другие ключи в read
и write
, которые перезапишут такие же настройки в главном массиве. Таким образом, 192.168.1.1
будет использоваться для чтения, а 192.168.1.2
- для записи. Остальные настройки совпадают.
Выполнение запросов
Как только вы настроили соединение с базой данных, вы можете выполнять запросы используя фасад DB
.
Выполнение запроса SELECT
$results = DB::select('select * from users where id = ?', [1]);
Метод select
всегда возвращает массив результатов.
Выполнение запроса INSERT
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
Выполнение запроса UPDATE
DB::update('update users set votes = 100 where name = ?', ['John']);
Выполнение запроса DELETE
DB::delete('delete from users');
Примечание: запросы
update
иdelete
возвращают число затронутых строк.
Выполнение запроса другого типа
DB::statement('drop table users');
Реагирование на выполнение запросов
Вы можете добавить собственный обработчик, вызываемый при выполнении очередного запроса, с помощью метода DB::listen
:
DB::listen(function($sql, $bindings, $time)
{
//
});
Транзакции
Для выполнения запросов внутри одной транзакции, воспользуйтесь методом transaction
:
DB::transaction(function()
{
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
Примечание: Любая ошибка, полученная при выполнении запросов транзакции, отменит все изменения, вызванные ей.
Иногда вам понадобится начать транзакцию вручную:
DB::beginTransaction();
Отмена транзакции и изменений, вызванных её выполнением:
DB::rollback();
Завершение и подтверждение транзакцию:
DB::commit();
Доступ к соединениям
При использовании нескольких подключений к БД, вы можете получить к ним достум через метод DB::connection
:
$users = DB::connection('foo')->select(...);
Вы также можете получить низкоуровневый объект PDO этого подключения:
$pdo = DB::connection()->getPdo();
Иногда вам может понадобиться переподключиться к БД и вы можете сделать это так:
DB::reconnect('foo');
Если вам нужно отключиться от БД - например, чтобы не превысить лимит max_connections
в БД, вы можете воспользоваться методом disconnect
:
DB::disconnect('foo');
Журнал запросов
По умолчанию, Laravel записывает все SQL-запросы в памяти, выполненные в рамках текущего HTTP-запроса. Однако, в некоторых случаях, как например при вставке большого количества записей, это может быть слишком ресурсозатратно. Для отключения журнала вы можете использовать метод disableQueryLog
:
DB::connection()->disableQueryLog();
Для получения массива выполненных запросов используйте метод getQueryLog
:
$queries = DB::getQueryLog();