Построитель запросов (Query builder) Laravel предлагает интерфейс для создания и выполнения запросов к базе данных. Его можно использовать для выполнения большинства операций с базой данных в вашем приложении и он отлично работает со всеми поддерживаемыми Laravel системами баз данных.
Вы можете использовать метод table
фасада DB
, чтобы начать запрос. Метод table
возвращает текущий экземпляр построителя запросов для данной таблицы, позволяя вам связать больше ограничений к запросу
$cat = DB::table(‘categories’);
Рассмотрим реализацию CRUD с помощью построителя запросов
SELECT
Для создания SELECT-запросов, сперва необходимо создать объект классаDB и статического метода table(), входящим параметром в который необходимо передать имя таблицы.
Для получения результата можно воспользоваться следующими методами:
Получить все поля таблицы можно, используя метод get().
$cat = DB::table(‘categories’)->get();
Уточнение запроса осуществляется с помощью метода where()
$cat = DB::table(‘categories’)->where(‘showhide’, ‘=’, ‘show’)->get();
Конструктор запросов может быть использован для выборки данных из нескольких таблиц через JOIN.
DB::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.id', 'contacts.phone', 'orders.price');
Если необходимо сделать сложную фильтацию, то в значение методов where()или orWhere() можно добавлять функуию с дополнительным query-запросом:
DB::table('users') ->where('name', '=', 'Джон') ->orWhere(function ($query) { $query->where('votes', '>', 100) ->where('title', '<>', 'Админ'); })->get();
INSERT
DB::table('users')->insert( array('email' => 'john@example.com', 'votes' => 0) );
Если необходимо вставить данные и при этом тут же получить id, можно воспользоваться методом insertGetId.
$id = DB::table('users')->insertGetId( array('email' => 'john@example.com', 'votes' => 0) );
Laravel также поддерживает множественную вставку данных:
DB::table('users')->insert(array( array('email' => 'taylor@example.com', 'votes' => 0), array('email' => 'dayle@example.com', 'votes' => 0), ));
UPDATE
Для обновления данных можно воспользоваться методом update()
.
DB::table('users')->where('id', 1) ->update(array('votes' => 1));
Однако, обновление можно осуществить и с помощью метода save()
$obj = DB::table('users')->where('id', 1); $obj->votes = 1; $obj->save();
DELETE
DB::table('users')->where('votes', '<', 100)->delete(); DB::update('update users set votes = 100 where name = ?', array('John'));
Выполнение запросов другого типа
DB::statement('drop table users');
Транзакции
Для выполнения запросов внутри одной транзакции, можно воспользоваться методом transaction.
DB::transaction(function(){ DB::table('users')->update(array('votes' => 1)); DB::table('posts')->delete(); });
Доступ к соединениям
При использовании нескольких подключений к БД, вы можете получить к ним доступ через метод DB::connection:
$users = DB::connection('foo')->select(...); $pdo = DB::connection()->getPdo(); // получение объектаPDO указанног соединения. DB::reconnect('foo'); // переподключение к базе данных
Если вам нужно отключиться от БД - например, чтобы не превысить лимит max_connections в БД, вы можете воспользоваться методом disconnect
DB::disconnect('foo');
По умолчанию, Laravel записывает все SQL-запросы в памяти, выполненные в рамках текущего HTTP-запроса.
Однако, в некоторых случаях, как, например, при вставке большого количества записей, это может быть слишком ресурсозатратно. Для отключения журнала вы можете использовать метод disableQueryLog:
DB::connection()->disableQueryLog();
Для получения массива выполненных запросов используйте метод getQueryLog:
$queries = DB::getQueryLog();
Практика