Настройка
Laravel делает процесс соединения с БД и выполнение запросов очень простым. Настройки работы с БД хранятся в файле app/config/database.php. Здесь вы можете указать все используемые вами соединения к БД, а также задать то, какое из них будет использоваться по умолчанию. Примеры настройки всех возможных видов подключений находятся в этом же файле.
На данный момент Laravel поддерживает 4 СУБД: MySQL, PostgreSQL, SQLite и SQL Server.
добавлено в 4.1 ()
Соединения для чтения/записи данных
Иногда вам может понадобиться использовать разные подключения к базе данных: одно для запросов SELECT, а другое для запросов INSERT, UPDATE и DELETE. В Laravel это делается очень просто, и всегда будет использоваться соответствующее соединение, используете ли вы сырые запросы, построитель запросов или 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' => '',
),
Обратите внимание, что в массив настроек были добавлены два элемента: sql'read'
и sql'write'
. Оба элемента представляют собой массив с одним элементом sql'host'
. Остальные параметры БД для подключений чтения/записи будут заимствованы из основного массива sql'mysql'
. Поэтому размещать элементы в массивах для этих подключений стоит, только если вы хотите переопределить их значения из основного массива. Таким образом, в этом случае, 192.168.1.1 будет использоваться как подключение «чтения», а 192.168.1.2 — как подключение «записи». Полномочия БД, префикс, набор символов, и все другие параметры основного массива sql'mysql'
будут использованы для обоих подключений.
Выполнение запросов
Как только вы настроили соединение с базой данных вы можете выполнять запросы, используя класс PHPDB
.
$results = DB::select('select * from users where id = ?', array(1));
Метод PHPselect()
всегда возвращает массив.
DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle'));
DB::update('update users set votes = 100 where name = ?', array('John'));
DB::delete('delete from users');
Методы PHPupdate()
и PHPdelete()
возвращают число затронутых строк.
Выполнение запроса другого типа
DB::statement('drop table users');
Реагирование на выполнение запросов
Вы можете добавить собственный обработчик, вызываемый при выполнении очередного запроса, с помощью метода PHPDB::listen()
:
DB::listen(function ($sql, $bindings, $time) {
//
});
Транзакции
Вы можете использовать метод PHPDB::transaction()
для выполнения запросов внутри одной транзакции:
DB::transaction(function () {
DB::table('users')->update(array('votes' => 1));
DB::table('posts')->delete();
});
добавлено в 4.1 ()
Любое исключение, возникшее в функции-замыкании PHPtransaction
, приведёт к автоматическому откату транзакции.
Иногда вам необходимо запустить транзакцию самостоятельно:
DB::beginTransaction();
Вы можете откатить транзакцию методом PHProllback
:
DB::rollback();
Наконец, вы можете завершить транзакцию методом PHPcommit
:
DB::commit();
Транзакция — особое состояние БД, в котором выполняемые запросы либо все вместе успешно завершаются, либо (в случае ошибки) все их изменения откатываются. Это позволяет поддерживать целостность внутренней структуры данных. К примеру, если вы вставляете запись о заказе, а затем в отдельную таблицу добавляете товары, то при неуспешном выполнении скрипта (в том числе падения веб-сервера, ошибки в запросе и пр.) СУБД автоматически удалит запись о заказе и все товары, которые вы успели добавить — прим. пер.
Другие соединения
При использовании нескольких подключений к БД вы можете получить доступ к ним через метод PHPDB::connection()
:
$users = DB::connection('foo')->select(...);
Вы также можете получить низкоуровневый объект PDO для этого подключения:
$pdo = DB::connection()->getPdo();
Иногда вам может понадобиться переподключиться и вы можете сделать это так:
DB::reconnect('foo');
добавлено в 4.1 ()
Журнал запросов
По умолчанию Laravel записывает все SQL-запросы, выполненные в рамках текущего запроса страницы. Однако в некоторых случаях — например, при вставке большого набора записей — это может быть слишком ресурсозатратно. Для отключения журнала вы можете использовать метод PHPdisableQueryLog()
:
DB::connection()->disableQueryLog();
Чтобы получить массив выполненных запросов, вы можете использовать метод PHPgetQueryLog()
:
$queries = DB::getQueryLog();
Комментарии (2)
public function rollBack($toLevel = null)
в текстеDB::rollback();
возможно опечаткаЭто документация ветки 4.2, а не 5.