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

Конструктор запросов

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

  1. 1. Введение
  2. 2. Выборка (SELECT)
  3. 3. Объединения (JOIN)
  4. 4. Сложная фильтрация (WHERE)
  5. 5. Агрегатные функции
  6. 6. Сырые выражения
  7. 7. Вставка (INSERT)
  8. 8. Обновление (UPDATE)
  9. 9. Удаление (DELETE)
  10. 10. Слияние (UNION)
  11. 11. Пессимистическая блокировка
  12. 12. Кэширование запросов
Этот перевод актуален для англоязычной документации на (ветка 4.2) , (ветка 4.1) и (ветка 4.0). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

Конструктор запросов предоставляет удобный, выразительный интерфейс для создания и выполнения запросов к базе данных. Он может использоваться для выполнения большинства типов операций и работает со всеми поддерживаемыми СУБД.

Внимание: конструктор запросов Laravel использует привязку параметров к запросам средствами PDO для защиты вашего приложения от SQL-инъекций. Нет необходимости экранировать строки перед их передачей в запрос.

Выборка (SELECT)

Получение всех записей таблицы

PHP
$users = DB::table('users')->get();

foreach (
$users as $user) {
  
var_dump($user->name);
}

Получение одной записи

PHP
$user = DB::table('users')->where('name', 'Джон')->first();

var_dump($user->name);

Получение одного поля из записей

PHP
$name = DB::table('users')->where('name', 'Джон')->pluck('name');

Получение списка всех значений одного поля

PHP
$roles = DB::table('roles')->lists('title');

Этот метод вернёт массив всех заголовков (title). Вы можете указать произвольный ключ для возвращаемого массива:

PHP
$roles = DB::table('roles')->lists('title', 'name');

Указание полей для выборки

PHP
$users = DB::table('users')->select('name', 'email')->get();

$users = DB::table('users')->distinct()->get();

$users = DB::table('users')->select('name as user_name')->get();

Добавление полей к созданному запросу

PHP
$query = DB::table('users')->select('name');

$users = $query->addSelect('age')->get();

Фильтрация через WHERE

PHP
$users = DB::table('users')->where('votes', '>', 100)->get();

Условия ИЛИ

PHP
$users = DB::table('users')
                    ->
where('votes', '>', 100)
                    ->
orWhere('name', 'Джон')
                    ->
get();

Фильтрация по интервалу значений

PHP
$users = DB::table('users')
                    ->
whereBetween('votes', array(1, 100))->get();
+ 4.1

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

Фильтрация по отсутствию в интервале

PHP
$users = DB::table('users')
                    ->
whereNotBetween('votes', array(1, 100))->get();

Фильтрация по совпадению с массивом значений

PHP
$users = DB::table('users')
                    ->
whereIn('id', array(1, 2, 3))->get();

$users = DB::table('users')
                    ->
whereNotIn('id', array(1, 2, 3))->get();

Поиск неустановленных значений (NULL)

PHP
$users = DB::table('users')
                    ->
whereNull('updated_at')->get();

Использование ORDER BY, GROUP BY и HAVING

PHP
$users = DB::table('users')
                    ->
orderBy('name', 'desc')
                    ->
groupBy('count')
                    ->
having('count', '>', 100)
                    ->
get();

Смещение от начала и лимит числа возвращаемых строк

PHP
$users = DB::table('users')->skip(10)->take(5)->get();

Объединения (JOIN)

Конструктор запросов может быть использован для выборки данных из нескольких таблиц через PHPJOIN. Посмотрите на примеры ниже.

Простое объединение

PHP
DB::table('users')
            ->
join('contacts', 'users.id', '=', 'contacts.user_id')
            ->
join('orders', 'users.id', '=', 'orders.user_id')
            ->
select('users.id', 'contacts.phone', 'orders.price');
            ->
get();

Объединение типа LEFT JOIN

PHP
DB::table('users')
        ->
leftJoin('posts', 'users.id', '=', 'posts.user_id')
        ->
get();

Вы можете указать более сложные условия:

PHP
DB::table('users')
        ->
join('contacts', function ($join) {
          
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
        })
        ->
get();
+ 4.1

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

Если вы хотите использовать стиль «where» для ваших объединений, то можете использовать для этого методы PHPwhere() и PHPorWhere(). Вместо сравнения двух столбцов эти методы будут сравнивать столбец и значение:

PHP
DB::table('users')
        ->
join('contacts', function($join)
        {
          
$join->on('users.id', '=', 'contacts.user_id')
               ->
where('contacts.user_id', '>', 5);
        })
        ->
get();

Сложная фильтрация (WHERE)

Группировка условий

Иногда вам нужно сделать выборку по более сложным параметрам, таким как «существует ли» или вложенная группировка условий. Конструктор запросов Laravel справится и с такими запросами:

PHP
DB::table('users')
            ->
where('name', '=', 'Джон')
            ->
orWhere(function ($query) {
                
$query->where('votes', '>', 100)
                      ->
where('title', '<>', 'Админ');
            })
            ->
get();

Команда выше выполнит такой SQL:

sqlselect * from users where name = 'Джон' or (votes > 100 and title <> 'Админ')

Проверка на существование

PHP
DB::table('users')
            ->
whereExists(function ($query) {
              
$query->select(DB::raw(1))
                    ->
from('orders')
                    ->
whereRaw('orders.user_id = users.id');
            })
            ->
get();

Эта команда выше выполнит такой запрос:

sqlselect * from users
where exists (
  select 1 from orders where orders.user_id = users.id
)

Агрегатные функции

Конструктор запросов содержит множество агрегатных методов, таких как count, max, min, avg и sum.

PHP
$users = DB::table('users')->count();

$price = DB::table('orders')->max('price');

$price = DB::table('orders')->min('price');

$price = DB::table('orders')->avg('price');

$total = DB::table('users')->sum('votes');

Сырые выражения

Иногда вам может быть нужно использовать уже готовое SQL-выражение в вашем запросе. Такие выражения вставляются в запрос напрямую в виде строк, поэтому будьте внимательны и не создавайте возможных точек для SQL-инъекций. Для создания сырого выражения используется метод PHPDB::raw().

Использование сырого выражения

PHP
$users = DB::table('users')
                     ->
select(DB::raw('count(*) as user_count, status'))
                     ->
where('status', '<>', 1)
                     ->
groupBy('status')
                     ->
get();

Вставка (INSERT)

Вставка записи в таблицу

PHP
DB::table('users')->insert(
  array(
'email' => 'john@example.com', 'votes' => 0)
);

Вставка записи и получение её нового ID

Если таблица имеет автоматическое числовое поле (autoincrementing), то можно использовать метод PHPinsertGetId() для вставки записи и получения её порядкового номера:

PHP
$id = DB::table('users')->insertGetId(
    array(
'email' => 'john@example.com', 'votes' => 0)
);

Внимание: при использовании PostgreSQL автоматическое поле должно иметь имя PHPid.

Вставка нескольких записей одновременно

PHP
DB::table('users')->insert(array(
    array(
'email' => 'taylor@example.com', 'votes' => 0),
    array(
'email' => 'dayle@example.com', 'votes' => 0),
));

Обновление (UPDATE)

Обновление записей в таблице

PHP
DB::table('users')
            ->
where('id', 1)
            ->
update(array('votes' => 1));

Увеличение или уменьшение значения поля

PHP
DB::table('users')->increment('votes');

DB::table('users')->increment('votes', 5);

DB::table('users')->decrement('votes');

DB::table('users')->decrement('votes', 5)

Вы также можете указать дополнительные поля для изменения:

PHP
DB::table('users')->increment('votes', 1, array('name' => 'Джон'));

Удаление (DELETE)

Удаление записей из таблицы

PHP
DB::table('users')->where('votes', '<', 100)->delete();

Удаление всех записей

PHP
DB::table('users')->delete();

Усечение таблицы

PHP
DB::table('users')->truncate();

Усечение таблицы аналогично удалению всех её записей, а также сбросом счётчика autoincrement-полей. — прим. пер.

Слияние (UNION)

Конструктор запросов позволяет создавать слияния двух запросов вместе:

PHP
$first = DB::table('users')->whereNull('first_name');

$users = DB::table('users')->whereNull('last_name')->union($first)->get();

Также существует метод PHPunionAll() с аналогичными параметрами.

+ 4.1

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

Пессимистическая блокировка

В построителе запросов есть несколько функций, которые помогают делать «пессимистическую блокировку» для ваших операторов SELECT.

Для запуска оператора SELECT с «разделяемой блокировкой» вы можете использовать в запросе метод PHPsharedLock:

PHP
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();

Чтобы «блокировать обновление» для оператора SELECT, вы можете использовать в запросе метод PHPlockForUpdate:

PHP
DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();

Кэширование запросов

Вы можете легко закэшировать результат выполнения запроса методом PHPremember():

PHP
$users = DB::table('users')->remember(10)->get();

В этом примере результаты выборки будут сохранены в кэше на 10 минут. В течении этого времени данный запрос не будет отправляться к СУБД — вместо этого результат будет получен из системы кэширования, указанной по умолчанию в вашем файле настроек.

+ 4.1

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

Если вы используете поддерживаемый драйвер кэша, то можете добавить в кэш теги:

PHP
$users = DB::table('users')->cacheTags(array('people', 'authors'))->remember(10)->get();

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

Разметка: ? ?

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