Перейти к основному содержимому

QueryTrait

Трейт: Xpage\Core\Trait\Component\QueryTrait

Назначение: Управление состоянием запроса к базе данных. Инкапсулирует логику многоуровневой сортировки и подготавливает инфраструктуру для работы с пагинацией и ленивой загрузкой данных в ORM-коллекции.

Зависимости:

  • Ядро: Bitrix\Main\UI\PageNavigation, Bitrix\Main\ORM\Query.
  • Обычно используется совместно с ParamTrait (который готовит параметры сортировки).

Свойства трейта

  • $paginator: Объект типа PageNavigation. Используется для реализации современной постраничной навигации в D7.
  • $fillFields: Массив кодов полей, которые нельзя выбрать простым SELECT (например, сложные связанные сущности через точку), и которые должны быть «дозаполнены» в коллекции объектов позже.
  • $fillProperties: Аналогичный массив, но для свойств инфоблока (особенно множественных), которые требуют метода fill() для загрузки данных в ORM-объекты.

2. prepareOrder(&$query)

Метод применяет правила сортировки к объекту запроса.

  • Логика: Проверяет наличие параметров SORT_FIELD и SORT_DIRECTION (от 1 до 3 уровней).
  • Действие: Вызывает $query->addOrder().
  • Связь: Параметры для этого метода подготавливаются стадией prepareSortParams из трейта ParamTrait.

Примеры использования

Использование в логике компонента

Трейт помогает настроить ORM-запрос перед его выполнением:

namespace Xpage\Core\Component;

class MyElementList extends \Xpage\Core\Component
{
use \Xpage\Core\Trait\Component\QueryTrait;
use \Xpage\Core\Trait\Component\ParamTrait;

public function executeComponent()
{
// 1. Подготовка параметров (из ParamTrait)
$this->arParams = $this->prepareComponentParams($this->arParams);

// 2. Создание запроса (через API-код инфоблока)
$query = \Bitrix\Iblock\Elements\ElementNewsTable::query();

// 3. Применение сортировки (из QueryTrait)
$this->prepareOrder($query);

// 4. Установка лимита (если есть пагинатор)
if ($this->arParams['PAGE_ELEMENT_COUNT'] > 0) {
$query->setLimit($this->arParams['PAGE_ELEMENT_COUNT']);
}

$collection = $query->fetchCollection();
// ... дальнейшая обработка ...
}
}

Технические особенности

  • Три уровня сортировки: В отличие от стандартных компонентов Битрикса, которые чаще поддерживают два уровня (SORT_BY1, SORT_BY2), этот трейт поддерживает три, что дает больше гибкости (например: Сортировка -> Дата -> ID).
  • Механизм Fill: Наличие массивов fillFields и fillProperties указывает на то, что проект активно использует Lazy Loading (ленивую загрузку) в ORM. В трейте ElementTrait эти массивы наполняются, а затем используются для вызова метода ->fill() у коллекции элементов, чтобы подтянуть данные свойств за один дополнительный запрос.
  • Передача по ссылке: Метод prepareOrder принимает $query по ссылке (&$query), поэтому он модифицирует исходный объект запроса напрямую.