Конструктор запросов
Query Builder → Community +860 31 мая 2015
Конструктор запросов Laravel предоставляет удобный, выразительный интерфейс для создания и выполнения запросов к базе данных. Он может использоваться для выполнения большинства типов операций и работает со всеми поддерживаемыми СУБД .
Конструктор запросов Laravel использует привязку параметров к запросам средствами PDO для защиты вашего приложения от SQL-инъекций. Нет необходимости экранировать строки перед их передачей в запрос.
Получение результатов
Получение всех записей таблицы
Используйте метод PHP table () фасада DB для создания запроса. Метод PHP table () возвращает экземпляр конструктора запросов для данной таблицы, позволяя вам «прицепить» к запросу дополнительные условия и в итоге получить результат методом PHP get () :
Метод PHP get () возвращает объект Illuminate\Support\Collection (для версии 5.2 и ранее — массив) c результатами, в котором каждый результат — это экземпляр PHP-объекта StdClass . Вы можете получить значение каждого столбца, обращаясь к столбцу как к свойству объекта:
Получение одной строки/столбца из таблицы
Если вам необходимо получить только одну строку из таблицы БД, используйте метод PHP first () . Этот метод вернёт один объект StdClass :
Если вам не нужна вся строка, вы можете извлечь одно значение из записи методом PHP value () . Этот метод вернёт значение конкретного столбца:
Получение списка всех значений одного столбца
Если вы хотите получить массив значений одного столбца, используйте метод PHP pluck () . В этом примере мы получим коллекцию (для версии 5.2 и ранее — массив) названий ролей:
Вы можете указать произвольный ключ для возвращаемой коллекции (для версии 5.2 и ранее — массива):
Если вы хотите получить массив значений одного столбца, используйте метод PHP lists () . В этом примере мы получим массив названий ролей:
Вы можете указать произвольный ключ для возвращаемого массива:
Получение результатов из таблицы «по кускам»
Если вам необходимо обработать тысячи записей БД, попробуйте использовать метод PHP chunk () . Этот метод получает небольшой «кусок» результатов за раз и отправляет его в замыкание для обработки. Этот метод очень полезен для написания Artisan-команд, которые обрабатывают тысячи записей. Например, давайте обработаем всю таблицу users «кусками» по 100 записей:
Вы можете остановить обработку последующих «кусков» вернув false из замыкания:
Агрегатные функции
Конструктор запросов содержит множество агрегатных методов, таких как count, max, min, avg и sum. Вы можете вызывать их после создания своего запроса:
Разумеется, вы можете комбинировать эти методы с другими условиями:
Выборка ( SELECT )
Указание столбцов для выборки
Само собой, не всегда вам необходимо выбрать все столбцы из таблицы БД. Используя метод PHP select () вы можете указать необходимые столбцы для запроса:
Метод PHP distinct () позволяет вернуть только отличающиеся результаты:
Если у вас уже есть экземпляр конструктора запросов и вы хотите добавить столбец к существующему набору для выборки, используйте метод PHP addSelect () :
Сырые выражения
Иногда вам может понадобиться использовать уже готовое SQL-выражение в вашем запросе. Такие выражения вставляются в запрос напрямую в виде строк, поэтому будьте внимательны и не допускайте возможностей для SQL-инъекций! Для создания сырого выражения используйте метод PHP DB :: raw () :
Объединения ( JOIN )
Конструктор запросов может быть использован для объединения данных из нескольких таблиц через PHP JOIN . Для выполнения обычного объединения «inner join» , используйте метод PHP join () на экземпляре конструктора запросов. Первый аргумент метода PHP join () — имя таблицы, к которой необходимо присоединить другие, а остальные аргументы указывают условия для присоединения столбцов. Как видите, вы можете объединять несколько таблиц одним запросом:
Для выполнения объединения «left join» вместо «inner join» , используйте метод PHP leftJoin () . Этот метод имеет ту же сигнатуру, что и метод PHP join () :
Для выполнения объединения CROSS JOIN используйте метод PHP crossJoin () с именем таблицы, с которой нужно произвести объединение. CROSS JOIN формирует таблицу перекрестным соединением (декартовым произведением) двух таблиц:
Сложные условия объединения
Вы можете указать более сложные условия для объединения. Для начала передайте замыкание вторым аргументом метода PHP join () . Замыкание будет получать объект JoinClause , позволяя вам указать условия для объединения:
Если вы хотите использовать стиль «where» для ваших объединений, то можете использовать для этого методы PHP where () и PHP orWhere () . Вместо сравнения двух столбцов эти методы будут сравнивать столбец и значение:
Слияние ( UNION )
Конструктор запросов позволяет создавать слияния двух запросов вместе. Например, вы можете создать начальный запрос и с помощью метода PHP union () слить его со вторым запросом:
Также существует метод PHP unionAll () с аналогичными параметрами.
Условия WHERE
Для добавления в запрос условий where используйте метод PHP where () на экземпляре конструктора запросов. Самый простой вызов PHP where () требует три аргумента. Первый — имя столбца. Второй — оператор (любой из поддерживаемых базой данных). Третий — значение для сравнения со столбцом.
Например, вот запрос, проверяющий равенство значения столбца «votes» и 100:
Для удобства, если вам необходимо просто проверить равенство значения столбца и данного значения, вы можете передать значение сразу вторым аргументом метода PHP where () :
Разумеется, вы можете использовать различные другие операторы при написании условия where :
В функцию PHP where () также можно передать массив условий:
Вы можете сцепить вместе условия where , а также условия or в запросе. Метод PHP orWhere () принимает те же аргументы, что и метод PHP where () :
Дополнительные условия WHERE
Метод PHP whereBetween () проверяет, что значения столбца находится в указанном интервале:
Метод PHP whereNotBetween () проверяет, что значения столбца находится вне указанного интервала:
Фильтрация по совпадению с массивом значений
Метод PHP whereIn () проверяет, что значения столбца содержатся в данном массиве:
Метод PHP whereNotIn () проверяет, что значения столбца не содержатся в данном массиве:
Поиск неустановленных значений ( NULL )
Метод PHP whereNull () проверяет, что значения столбца равны PHP NULL :
Метод PHP whereNotNull () проверяет, что значения столбца не равны PHP NULL :
whereDate / whereMonth / whereDay / whereYear
Метод PHP whereDate () служит для сравнения значения столбца с датой:
Метод PHP whereMonth () служит для сравнения значения столбца с месяцем в году:
Метод PHP whereDay () служит для сравнения значения столбца с днём месяца:
Метод PHP whereYear () служит для сравнения значения столбца с указанным годом:
Динамические условия WHERE
Вы можете использовать даже «динамические» условия where для гибкого построения операторов, используя магические методы:
Для проверки на совпадение двух столбцов можно использовать метод PHP whereColumn () :
В метод также можно передать оператор сравнения:
В метод PHP whereColumn () также можно передать массив с несколькими условиями. Эти условия будут объединены оператором AND :
Группировка условий
Иногда вам нужно сделать выборку по более сложным параметрам, таким как «существует ли» или вложенная группировка условий. Конструктор запросов Laravel справится и с такими запросами. Для начала посмотрим на пример группировки условий в скобках:
Как видите, передав замыкание в метод PHP orWhere () , мы дали конструктору запросов команду, начать группировку условий. Замыкание получит экземпляр конструктора запросов, который вы можете использовать для задания условий, поместив их в скобки. Приведённый пример выполнит такой SQL-запрос:
Проверка на существование
Метод PHP whereExists () позволяет написать SQL-условие where exists . Метод PHP whereExists () принимает в качестве аргумента замыкание, которое получит экземпляр конструктора запросов, позволяя вам определить запрос для помещения в условие «exists» :
Этот пример выполнит такой SQL-запрос:
JSON фильтрация ( WHERE )
Laravel также поддерживает запросы для столбцов типа JSON в тех БД, которые поддерживают тип столбцов JSON. На данный момент это MySQL 5.7 и Postgres. Для запроса JSON столбца используйте оператор -> :
Упорядочивание, группировка, предел и смещение
Метод PHP orderBy () позволяет вам отсортировать результат запроса по заданному столбцу. Первый аргумент метода PHP orderBy () — столбец для сортировки по нему, а второй — задаёт направление сортировки и может быть либо asc , либо desc :
Методы PHP latest () и PHP oldest () позволяют легко отсортировать результаты по дате. По умолчанию выполняется сортировка по столбцу created_at . Или вы можете передать имя столбца для сортировки по нему:
Для сортировки результатов запроса в случайном порядке можно использовать метод PHP inRandomOrder () . Например, вы можете использовать этот метод для выбора случайного пользователя:
Методы PHP groupBy () и PHP having () используются для группировки результатов запроса. Сигнатура метода PHP having () аналогична методу PHP where () :
Метод PHP havingRaw () используется для передачи сырой строки в условие having . Например, мы можем найти все филиалы с объёмом продаж выше $2,500:
Для ограничения числа возвращаемых результатов из запроса или для пропуска заданного числа результатов в запросе используются методы PHP skip () и PHP take () :
Или вы можете использовать методы PHP limit () и PHP offset () :
Условное применение условий
Иногда необходимо применять условие к запросу, только если выполняется какое-то другое условие. Например, выполнять оператор PHP where , только если нужное значение есть во входящем запросе. Это можно сделать с помощью метода PHP when () :
Метод PHP when () выполняет данное замыкание, только когда первый параметр равен PHP true . Если первый параметр равен PHP false , то замыкание не будет выполнено.
Вы можете передать ещё одно замыкание третьим параметром метода PHP when () . Это замыкание будет выполнено, если первый параметр будет иметь значение PHP false . Для демонстрации работы этой функции мы используем её для настройки сортировки по умолчанию для запроса:
Вставка ( INSERT )
Конструктор запросов предоставляет метод PHP insert () для вставки записей в таблицу БД. Метод PHP insert () принимает массив имён столбцов и значений:
Вы можете вставить в таблицу сразу несколько записей одним вызовом PHP insert () , передав ему массив массивов, каждый из которых — строка для вставки в таблицу:
Если в таблице есть автоинкрементный ID, используйте метод PHP insertGetId () для вставки записи и получения её ID:
При использовании метода PHP insertGetId () для PostgreSQL автоинкрементное поле должно иметь имя PHP id . Если вы хотите получить ID из другого поля таблицы, вы можете передать его имя вторым аргументом.
Обновление ( UPDATE )
Разумеется, кроме вставки записей в БД конструктор запросов может и изменять существующие строки с помощью метода PHP update () . Метод PHP update () , как и метод PHP insert () , принимает массив столбцов и пар значений, содержащих столбцы для обновления. Вы можете ограничить запрос PHP update () условием PHP where () :
Обновление JSON-столбцов
При обновлении JSON-столбцов используйте синтаксис PHP -> для обращения к нужному ключу в JSON-объекте. Эта операция поддерживается только в БД, поддерживающих JSON-столбцы:
Increment и Decrement
Конструктор запросов предоставляет удобные методы для увеличения и уменьшения значений заданных столбцов. Это просто более выразительный и краткий способ по сравнению с написанием оператора update вручную.
Оба метода принимают один обязательный аргумент — столбец для изменения. Второй аргумент может быть передан для указания, на какую величину необходимо изменить значение столбца:
Вы также можете указать дополнительные поля для изменения:
Удаление ( DELETE )
Конструктор запросов предоставляет метод PHP delete () для удаления записей из таблиц. Вы можете ограничить оператор PHP delete () , добавив условие PHP where () перед его вызовом:
Если вы хотите очистить таблицу (усечение), удалив все строки и обнулив счётчик ID, используйте метод PHP truncate () :
Усечение таблицы аналогично удалению всех её записей, а также сбросом счётчика autoincrement-полей. — прим. пер.
Пессимистическая блокировка
В конструкторе запросов есть несколько функций, которые помогают делать «пессимистическую блокировку» (pessimistic locking) для ваших операторов SELECT. Для запуска оператора SELECT с «разделяемой блокировкой» вы можете использовать в запросе метод PHP sharedLock () . Разделяемая блокировка предотвращает изменение выбранных строк до конца транзакции:
Или вы можете использовать метод PHP lockForUpdate () . Блокировка «для изменения» предотвращает изменение строк и их выбор другими разделяемыми блокировками:
Статистика: Символов — 29 326/24 354 без пробелов (11 645/10 008 без кода):, слов — 1 638
Комментариев нет: