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

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

перевод документация 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(1100))->get();
+ 4.1

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

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

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

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

PHP
$users DB::table('users')
                    ->
whereIn('id', array(123))->get();

$users DB::table('users')
                    ->
whereNotIn('id', array(123))->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();

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

Разметка: ? ?

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