Может войдёшь?
Черновики Написать статью Профиль

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

перевод документация 4.x

  1. 1. Настройка
  2. 2. Соединения для чтения/записи данных
  3. 3. Выполнение запросов
  4. 4. Транзакции
  5. 5. Другие соединения
  6. 6. Журнал запросов
Этот перевод актуален для англоязычной документации на (ветка 4.1) и (ветка 4.0). Опечатка? Выдели и нажми Ctrl+Enter.

Настройка

Laravel делает процесс соединения с БД и выполнение запросов очень простым. Настройки работы с БД хранятся в файле app/config/database.php. Здесь вы можете указать все используемые вами соединения к БД, а также задать то, какое из них будет использоваться по умолчанию. Примеры настройки всех возможных видов подключений находятся в этом же файле.

На данный момент Laravel поддерживает 4 СУБД: MySQL, PostgreSQL, SQLite и SQL Server.

+ 4.1

добавлено в 4.1 ()

Соединения для чтения/записи данных

Иногда вам может понадобиться использовать разные подключения к базе данных: одно для запросов SELECT, а другое для запросов INSERT, UPDATE и DELETE. В Laravel это делается очень просто, и всегда будет использоваться соответствующее соединение, используете ли вы сырые запросы, построитель запросов или Eloquent ORM.

Чтобы увидеть, как должны быть настроены соединения чтения/записи, давайте посмотрим на этот пример:

PHP
'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.

Выполнение запроса SELECT

PHP
$results DB::select('select * from users where id = ?', array(1));

Метод PHPselect() всегда возвращает массив.

Выполнение запроса INSERT

PHP
DB::insert('insert into users (id, name) values (?, ?)', array(1'Dayle'));

Выполнение запроса UPDATE

PHP
DB::update('update users set votes = 100 where name = ?', array('John'));

Выполнение запроса DELETE

PHP
DB::delete('delete from users');

Методы PHPupdate() и PHPdelete() возвращают число затронутых строк.

Выполнение запроса другого типа

PHP
DB::statement('drop table users');

Реагирование на выполнение запросов

Вы можете добавить собственный обработчик, вызываемый при выполнении очередного запроса, с помощью метода PHPDB::listen():

PHP
DB::listen(function ($sql$bindings$time) {
  
//
});

Транзакции

Вы можете использовать метод PHPDB::transaction() для выполнения запросов внутри одной транзакции:

PHP
DB::transaction(function () {
  
DB::table('users')->update(array('votes' => 1));

  
DB::table('posts')->delete();
});
+ 4.1

добавлено в 4.1 ()

Любое исключение, возникшее в функции-замыкании PHPtransaction, приведёт к автоматическому откату транзакции.

Иногда вам необходимо запустить транзакцию самостоятельно:

PHP
DB::beginTransaction();

Вы можете откатить транзакцию методом PHProllback:

PHP
DB::rollback();

Наконец, вы можете завершить транзакцию методом PHPcommit:

PHP
DB::commit();

Транзакция — особое состояние БД, в котором выполняемые запросы либо все вместе успешно завершаются, либо (в случае ошибки) все их изменения откатываются. Это позволяет поддерживать целостность внутренней структуры данных. К примеру, если вы вставляете запись о заказе, а затем в отдельную таблицу добавляете товары, то при неуспешном выполнении скрипта (в том числе падения веб-сервера, ошибки в запросе и пр.) СУБД автоматически удалит запись о заказе и все товары, которые вы успели добавить — прим. пер.

Другие соединения

При использовании нескольких подключений к БД вы можете получить доступ к ним через метод PHPDB::connection():

PHP
$users DB::connection('foo')->select(...);

Вы также можете получить низкоуровневый объект PDO для этого подключения:

PHP
$pdo DB::connection()->getPdo();

Иногда вам может понадобиться переподключиться и вы можете сделать это так:

PHP
DB::reconnect('foo');
+ 4.1

добавлено в 4.1 ()

Если вам нужно отключиться от данной БД из-за превышения основного предела экземпляров PDO max_connections, используйте метод PHPdisconnect:

PHP
DB::disconnect('foo');

Журнал запросов

По умолчанию Laravel записывает все SQL-запросы, выполненные в рамках текущего запроса страницы. Однако в некоторых случаях — например, при вставке большого набора записей — это может быть слишком ресурсозатратно. Для отключения журнала вы можете использовать метод PHPdisableQueryLog():

PHP
DB::connection()->disableQueryLog();

Чтобы получить массив выполненных запросов, вы можете использовать метод PHPgetQueryLog():

PHP
$queries DB::getQueryLog();

Комментарии (2)

Shov

public function rollBack($toLevel = null) в тексте DB::rollback(); возможно опечатка

Proger_XP

Это документация ветки 4.2, а не 5.

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.