Блог Горошко Андрея 1C-Битрикс Гибкая выборка в D7 ORM: Мастер-класс по классу Query

Гибкая выборка в D7 ORM: Мастер-класс по классу Query

Средний рейтинг
Еще нет оценок

Хотя статический метод ::getList() удобен для простых выборок, его возможности ограничены, когда условия запроса нужно формировать динамически.

Для таких задач в D7 ORM существует специальный класс-конструктор — \Bitrix\Main\Entity\Query.

По сути, ::getList() — это всего лишь удобная «обертка» над Query.

Использование Query напрямую дает вам полный контроль над каждым аспектом запроса.

Когда использовать Query вместо getList?

  • Когда фильтры, сортировка или выбираемые поля добавляются в зависимости от множества условий.
  • Когда нужно построить сложный подзапрос.
  • Когда нужно получить итоговый SQL-текст запроса для отладки, не выполняя его.

Шаг 1: Создание объекта Query

Для начала нужно создать экземпляр класса, передав ему объект сущности.

use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Main\Entity\Query; // Импортируем класс Query

Loader::includeModule('iblock');

// Получаем сущность
$entity = ElementTable::getEntity();

// Создаем объект конструктора запросов
$query = new Query($entity);

Или, используя статический хелпер, что короче и предпочтительнее:

$query = ElementTable::query();

Шаг 2: Построение запроса

Теперь мы можем «собирать» наш запрос по частям, используя сеттеры.

$query = ElementTable::query();

// Установка полей для выборки (аналог select)
$query->setSelect(['ID', 'NAME', 'CODE']);

// Установка фильтрации (аналог filter)
$query->setFilter(['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y']);

// Установка сортировки (аналог order)
$query->setOrder(['SORT' => 'ASC']);

// Установка лимита и смещения (аналог limit и offset)
$query->setLimit(10);
$query->setOffset(20);

Динамическое добавление условий

В этом и есть главная сила Query. Вы можете добавлять условия по мере необходимости.

$query = ElementTable::query();
$query->setSelect(['ID', 'NAME']);
$query->setFilter(['=IBLOCK_ID' => 5]);

// Если в запросе есть параметр поиска, добавляем фильтр по имени
if (!empty($_GET['q'])) {
    $query->addFilter('%NAME', $_GET['q']);
}

// Если выбрана сортировка, добавляем ее
if ($_GET['sort'] === 'name') {
    $query->addOrder('NAME', 'ASC');
} else {
    $query->addOrder('ID', 'DESC');
}
  • set… — полностью перезаписывает параметр.
  • add… — добавляет значение к параметру (например, addFilter, addOrder).

Шаг 3: Выполнение запроса и получение результата

После того как запрос собран, его нужно выполнить методом exec(). Он возвращает стандартный объект \Bitrix\Main\DB\Result.

// Выполняем собранный запрос
$result = $query->exec();

// Обрабатываем результат как обычно
while ($row = $result->fetch()) {
    echo $row['NAME'] . '<br>';
}

Отладка: Получение SQL-запроса

Иногда нужно посмотреть, какой именно SQL-запрос сгенерировал ORM. Метод getQuery() вернет вам готовую строку.

$query = ElementTable::query()
    ->setSelect(['ID', 'NAME'])
    ->setFilter(['=IBLOCK_ID' => 5])
    ->setLimit(10);

// Получаем SQL-строку, не выполняя запрос
$sql = $query->getQuery();

echo $sql;
// Выведет: SELECT `iblock_element`.`ID` AS `ID`, `iblock_element`.`NAME` AS `NAME` FROM `b_iblock_element` `iblock_element` WHERE `iblock_element`.`IBLOCK_ID` = 5 LIMIT 10

Вывод:
Класс Query — это профессиональный инструмент для построения сложных и динамических запросов в D7 ORM. Он дает полный контроль над каждым этапом формирования запроса и является незаменимым помощником при работе с нетривиальными фильтрами, а также при отладке.

D7 ORM, Query class, Bitrix ORM, setSelect, setFilter, addOrder, setLimit, exec, getQuery, построитель запросов.

Мой рейтинг:

Добавить комментарий

Related Post

result_modifier.php: Модификация данных компонента перед выводом в шаблонresult_modifier.php: Модификация данных компонента перед выводом в шаблон

Средний рейтинг Еще нет оценок Файл result_modifier.php — это специальный файл в шаблоне компонента, который выполняется после component.php, но до template.php. Его главная и единственная задача — модифицировать массив $arResult, подготавливая его к максимально простому выводу в

Использование Bitrix\Main\ORM\Query\Query для построения сложных запросов к Highload-блокамИспользование Bitrix\Main\ORM\Query\Query для построения сложных запросов к Highload-блокам

Средний рейтинг Еще нет оценок Highload-блоки в Битрикс — это эффективный инструмент для работы с крупными объемами данных, значительно превосходящий стандартные инфоблоки по производительности, особенно в условиях высоких нагрузок. Они

Отладка и Логирование в Битрикс: Инструменты разработчикаОтладка и Логирование в Битрикс: Инструменты разработчика

Средний рейтинг Еще нет оценок Ни один разработчик не может обойтись без инструментов отладки. В Битрикс есть несколько способов посмотреть, что происходит «под капотом», от самых простых до продвинутых. 1.