{{TOC}} {{DOCVER 4.0=0da300f6445bec5a70d007f503834fce957b065b 16.10.2014 04:19:00, 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 05:21:00}} == Настройка == Laravel делает процесс соединения с БД и выполнение запросов очень простым. Настройки работы с БД хранятся в файле %%(t) app/config/database.php%%. Здесь вы можете указать все используемые вами соединения к БД, а также задать то, какое из них будет использоваться по умолчанию. Примеры настройки всех возможных видов подключений находятся в этом же файле. На данный момент Laravel поддерживает 4 СУБД: MySQL, PostgreSQL, SQLite и SQL Server. %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 05:21:00) == Соединения для чтения/записи данных == Иногда вам может понадобиться использовать разные подключения к базе данных: одно для запросов %%(t)SELECT%%, а другое для запросов %%(t)INSERT%%, %%(t)UPDATE%% и %%(t)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'%% будут использованы для обоих подключений. %% == Выполнение запросов == Как только вы настроили соединение с базой данных вы можете выполнять запросы, используя класс %%DB%%. **Выполнение запроса %%(t)SELECT%%** %% $results = DB::select('select * from users where id = ?', array(1)); %% Метод %%select()%% всегда возвращает массив. **Выполнение запроса %%(t)INSERT%%** %% DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle')); %% **Выполнение запроса %%(t)UPDATE%%** %% DB::update('update users set votes = 100 where name = ?', array('John')); %% **Выполнение запроса %%(t)DELETE%%** %% DB::delete('delete from users'); %% .(alert) Методы %%update()%% и %%delete()%% возвращают число затронутых строк. **Выполнение запроса другого типа** %% DB::statement('drop table users'); %% **Реагирование на выполнение запросов** Вы можете добавить собственный обработчик, вызываемый при выполнении очередного запроса, с помощью метода %%DB::listen()%%: %% DB::listen(function ($sql, $bindings, $time) { // }); %% == Транзакции == Вы можете использовать метод %%DB::transaction()%% для выполнения запросов внутри одной транзакции: %% DB::transaction(function () { DB::table('users')->update(array('votes' => 1)); DB::table('posts')->delete(); }); %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 05:21:00) .(alert) Любое исключение, возникшее в функции-замыкании %%transaction%%, приведёт к автоматическому откату транзакции. Иногда вам необходимо запустить транзакцию самостоятельно: ~%% DB::beginTransaction(); ~%% Вы можете откатить транзакцию методом %%rollback%%: ~%% DB::rollback(); ~%% Наконец, вы можете завершить транзакцию методом %%commit%%: ~%% DB::commit(); ~%% %% .(tl_note) **Транзакция** - особое состояние БД, в котором выполняемые запросы либо все вместе успешно завершаются, либо (в случае ошибки) все их изменения откатываются. Это позволяет поддерживать целостность внутренней структуры данных. К примеру, если вы вставляете запись о заказе, а затем в отдельную таблицу добавляете товары, то при неуспешном выполнении скрипта (в том числе падения веб-сервера, ошибки в запросе и пр.) СУБД автоматически удалит запись о заказе и все товары, которые вы успели добавить - //прим. пер.// == Другие соединения == При использовании нескольких подключений к БД вы можете получить доступ к ним через метод %%DB::connection()%%: %% $users = DB::connection('foo')->select(...); %% Вы также можете получить низкоуровневый объект ((phpdoc:book.pdo PDO)) для этого подключения: %% $pdo = DB::connection()->getPdo(); %% Иногда вам может понадобиться переподключиться и вы можете сделать это так: %% DB::reconnect('foo'); %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 05:21:00) Если вам нужно отключиться от данной БД из-за превышения основного предела экземпляров PDO //max_connections//, используйте метод %%disconnect%%: ~%% DB::disconnect('foo'); ~%% %% == Журнал запросов == По умолчанию Laravel записывает все SQL-запросы, выполненные в рамках текущего запроса страницы. Однако в некоторых случаях - например, при вставке большого набора записей - это может быть слишком ресурсозатратно. Для отключения журнала вы можете использовать метод %%disableQueryLog()%%: %% DB::connection()->disableQueryLog(); %% Чтобы получить массив выполненных запросов, вы можете использовать метод %%getQueryLog()%%: %% $queries = DB::getQueryLog(); %%