Версия фреймворка:
5.4 4.2
Прогресс перевода
Перевод полностью актуален оригиналу.

Основы работы с базой данных

Настройка

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();