Laravel. Прямые запросы и кое-что ещё

screenshot-laravel com 2016-03-28 10-36-38 Этот пост не содержит ничего очень важного. Просто чтоб было.

Для выполнения прямых запросов к БД достаточно, чтобы у вас в конфигах Laravel были прописаны настройки БД.

Запуск запросов
————————-
Мы будем использовать класс DB. Если помните в Kohana была автозагрузка используемых классов. Здесь же надо явно указывать, какие классы вы собираетесь использовать. В нашем случае где-нибудь в титле надо прописать

use DB;

Дальше всё просто.

 $result = DB::select('select * from migrations');

В результате получается массив объектов stdClass

print_r($result);
// Результат
Array
(
    [0] => stdClass Object
        (
            [id] => 13
            [migration] => 2014_10_12_000000_create_users_table
            [batch] => 1
        )

    ............

)

С результатом я думаю всё понятно. А что если надо передать запросу какой-нибудь параметр?

Можно встроить его прямо в строку запроса. Но тогда SQL-инъекции и всё такое

$results = DB::select('select * from users where id = '.$id);

Передача параметров через массив защищает от инъекции

$results = DB::select('select * from users where id = ?', [$id]);

Можно передавать параметры через ассоциативный массив

$results = DB::select('select * from users where id = :id', ['id' => $id]);

Insert/update/delete

DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
DB::update('update users set votes = 100 where name = ?', ['John']);
DB::delete('delete from users');

Update и Delete вернут количество строк, к которым была применена команда.

Экзотика всякая
————————————
Тут я собрал то, что в реальном приложении вряд ли будет использоваться, но знать надо.

Просто sql инструкция:

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

А вот эта инструкция для меня является какой-то магией, я не до конца понял как оно работает, но завораживает. Можно отлавливать события посылки запросов.

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

Например, в Ларакасте был пример вывода на экран выполненного запроса

DB::listen(function($query){var_dump($query->sql);});

В artisan tinker оно выводит текст запроса после каждого обращения к БД. В т.ч. сформированного с использованием с помощью ORM (см. далее). Как оно работает в реальном приложении даже не представляю.

Запуск транзакций

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

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

Как и положено любой транзакции любая ошибка (Exception) откатит транзакцию полностью.
Также можно запускать/откатывать/завершать транзакции вручную

DB::beginTransaction();
DB::rollback();
DB::commit();

Не знаю зачем, но есть возможность на ходу подключиться к некоторому произвольному соединению. Не обязательно дефолтному. Естественно соединение должно быть прописано в конфигах

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

Обновить соединение. Наверное иногда надо.

DB::reconnect('foo');

Можно отсоединиться. Например если ваш скрипт достигает лимит соединений к БД.

DB::disconnect('foo');

Вместо резюме
На этом пока всё. Получилось немного больше чем просто прямые запросы, но пусть будет