Основы работы с базой данных
11.x
.
Почему это важно?
Настройка
Laravel делает процесс соединенеия с БД и выполнение запросов очень простым. Настройки работы с БД хранятся в файле app/config/database.php
. Здесь вы можете указать все используемые вами соединения к БД, а также задать то, какое из них будет использоваться по умолчанию. Примеры настройки всех возможных видов подключений находятся в этом же файле.
На данный момент Laravel поддерживает 4 СУБД: MySQL, Postgres, SQLite и SQL Server.
Раздельное чтение и запись
Если вы используете репликацию БД, для улучшения производительности вы можете использовать не одно, а два соединения с БД на разных серверах. С одного сервера (slave) вы можете только делать SELECT, а на другом (master) – INSERT, UPDATE и DELETE. Laravel прозрачно позволяет задействовать такой вариант работы, причем не важно, что вы используете – сырые запросы DB::select()
, Query Builder или Eloquent ORM.
Вот пример конфигурации:
'mysql' => array(
'read' => array(
'host' => '192.168.1.1',
),
'write' => array(
'host' => '196.168.1.2'
),
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
Вы можете располагать в 'read'
и 'write'
не только 'host'
, но и любые mysql-настройки, которые отличаются от общих настроек БД и уникальны для данного сервера – например, 'database'
, 'username'
и 'password'
. Если их не указывать, будут взяты общие настройки.
Вы также можете задать несколько серверов для операции чтения или записи. В таком случае конфиг будет выглядеть так:
'read' => array(
array('host' => '192.168.1.10'),
array('host' => '192.168.1.11'),
),
В таком случае сервер для чтения будет выбран случайным образом.
Выполнение запросов
Как только вы настроили соединение с базой данных вы можете выполнять запросы, используя класс DB
.
Выполнение запроса SELECT
$results = DB::select('select * from users where id = ?', array(1));
Метод select
всегда возвращает массив.
Выполнение запроса INSERT
DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle'));
Выполнение запроса UPDATE
DB::update('update users set votes = 100 where name = ?', array('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(array('votes' => 1));
DB::table('posts')->delete();
});
Транзакция – особое состояние БД, в котором выполняемые запросы либо все вместе успешно завершаются, либо (в случае ошибки, а конкретно – возбуждении исключения (exception)) все их изменения откатываются. Это позволяет поддерживать целостность внутренней структуры данных. К примеру, если вы вставляете запись о заказе, а затем в отдельную таблицу добавляете товары, то при неуспешном выполнении скрипта (в том числе падения вёб-сервера, ошибки в запросе и пр.) СУБД автоматически удалит запись о заказе и все товары, которые вы успели добавить – прим. пер.
Также доступны ручные операции с транзакциями:
Начать транзакцию:
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();