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

Настройка

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