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

Bitrix D7 ORM: Мастер-класс по ElementTable::getList для выборки элементов

Средний рейтинг
5 из 5 звезд. 1 голосов.

С появлением ядра D7 в 1С-Битрикс у разработчиков появился новый, объектно-ориентированный способ работы с базой данных — ORM (Object-Relational Mapping). Этот подход делает код более чистым, читаемым и зачастую более производительным по сравнению со старым API.

Для работы с элементами инфоблоков в D7 ORM используется класс \Bitrix\Iblock\ElementTable. Его основной метод для выборки данных — getList.

Подготовка к работе

Перед использованием ElementTable необходимо подключить модуль инфоблоков и импортировать класс:

use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;

// Проверяем, подключен ли модуль
if (!Loader::includeModule('iblock')) {
    die('Модуль iblock не установлен');
}

Базовый синтаксис getList

Метод getList принимает один массив с параметрами, который очень похож по своей структуре на SQL-запрос.

$result = ElementTable::getList([
    'select' => [...], // Какие поля выбрать
    'filter' => [...], // Условия фильтрации (WHERE)
    'order'  => [...], // Сортировка (ORDER BY)
    'limit'  => 10,     // Ограничение количества (LIMIT)
    'offset' => 20      // Смещение (OFFSET)
]);

1. Выборка полей (select)

Параметр select определяет, какие поля будут в результате. Можно использовать псевдонимы (алиасы).

// Выбираем ID, название и символьный код элемента,
// при этом полю NAME даем псевдоним TITLE
$result = ElementTable::getList([
    'select' => ['ID', 'TITLE' => 'NAME', 'CODE'],
    'filter' => ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y']
]);

Выборка свойств:
Для выборки свойств нужно использовать механизм «ссылок» (references). Для этого к названию поля свойства добавляется ->VALUE.

// Выбираем ID, название и свойство с кодом "ARTNUMBER"
$result = ElementTable::getList([
    'select' => ['ID', 'NAME', 'ARTICLE' => 'ARTNUMBER.VALUE'],
    'filter' => ['IBLOCK_ID' => 5]
]);

Важно: ARTNUMBER — это символьный код свойства. Для этого синтаксиса ORM сама построит JOIN к таблице свойств.

2. Фильтрация (filter)

Параметр filter полностью аналогичен $arFilter из старого API, но с более строгой и понятной логикой.

// Получаем активные элементы из инфоблока 5,
// у которых свойство "CITY" (с ID 12) равно "Москва"
$result = ElementTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => [
        '=IBLOCK_ID' => 5,
        '=ACTIVE' => 'Y',
        '=PROPERTY_12' => 'Москва' // Фильтр по свойству через ID
    ]
]);

Можно использовать операторы сравнения прямо в ключе:

  • = — равно (можно опустить)
  • != — не равно
  • > — больше
  • >= — больше или равно
  • % — LIKE

// Элементы, название которых содержит "статья"
'filter' => ['%NAME' => 'статья']

3. Сортировка (order)

Параметр order работает так же, как и в старом API.

$result = ElementTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => ['IBLOCK_ID' => 5],
    'order' => ['SORT' => 'ASC', 'NAME' => 'DESC']
]);

4. Лимит и смещение (limit, offset)

Эти параметры идеально подходят для постраничной навигации.

// Получить 10 элементов, начиная с 21-го (третья страница)
$result = ElementTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => ['IBLOCK_ID' => 5],
    'limit' => 10,
    'offset' => 20 // (3-1) * 10
]);

5. Динамические поля (runtime)

ORM D7 позволяет создавать «виртуальные» поля во время выполнения запроса. Например, можно посчитать количество комментариев для новости.

// Пример с подсчетом
$result = ElementTable::getList([
    'select' => ['ID', 'NAME', 'COMMENTS_CNT'],
    'filter' => ['IBLOCK_ID' => 5],
    'runtime' => [
        new \Bitrix\Main\Entity\ExpressionField(
            'COMMENTS_CNT',
            'COUNT(%s)',
            ['IBLOCK_ELEMENT_ID'] // Поле из другой таблицы, связанной с ElementTable
        )
    ]
]);

Обработка результата

Результат getList — это объект \Bitrix\Main\DB\Result. Для получения данных используется цикл while и метод fetch().

$result = ElementTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => ['IBLOCK_ID' => 5]
]);

while ($element = $result->fetch()) {
    echo "Элемент: " . $element['NAME'] . " (ID: " . $element['ID'] . ")<br>";
}

CIBlockElement::GetList vs. ElementTable::getList

КритерийCIBlockElement::GetList (старое API)ElementTable::getList (D7 ORM)
СинтаксисПроцедурный, массивы с «магическими» ключамиОбъектно-ориентированный, более строгий
ЧитаемостьНизкая, особенно при сложных фильтрахВысокая, напоминает SQL
ПроизводительностьВысокая, но легко написать медленный запросКак правило, выше за счет оптимизации запросов
ВозможностиОграниченыruntime поля, гибкие JOIN-ы, типизация

Вывод: Для новых проектов всегда используйте D7 ORM. Это стандарт современной разработки на Битрикс, который делает ваш код надежнее, понятнее и быстрее.


Bitrix D7, ORM, ElementTable, getList, Bitrix ORM, современная разработка Битрикс, сущности D7, выборка данных, фильтр, select, order, limit, offset.

Мой рейтинг:

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

Related Post

Правильное использование BB кода в 1С-БитриксПравильное использование BB кода в 1С-Битрикс

Средний рейтинг Еще нет оценок В 1С-Битрикс BB код используется для форматирования текста в различных модулях, таких как форумы, задачи, блоги и комментарии. Для его обработки используется класс CTextParser. Вот

Структура модулей и компонентов 1С-Битрикс: руководство для разработчиковСтруктура модулей и компонентов 1С-Битрикс: руководство для разработчиков

Средний рейтинг Еще нет оценок Введение: 1С-Битрикс – популярная система управления контентом (CMS) в России и странах СНГ. Ее гибкость и функциональность во многом обеспечиваются модульной архитектурой и компонентным подходом.

Система событий в Битрикс: AddEventHandler и современный EventManager из D7Система событий в Битрикс: AddEventHandler и современный EventManager из D7

Средний рейтинг Еще нет оценок Система событий — один из самых мощных механизмов в 1С-Битрикс. Она позволяет «вклиниваться» в стандартные процессы (например, перед добавлением товара в корзину или после обновления