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), поэтому он модифицирует исходный объект запроса напрямую.