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

ORM D7: Старое ядро vs Новое ядро

D7 — современное объектно-ориентированное ядро Битрикса. Оно принесло стандарты современного PHP: пространства имен (namespaces), автозагрузку классов, нормальный Exception Handling и, самое главное — ORM (Object-Relational Mapping).


Смена парадигмы

Главное отличие — переход от процедурного стиля и глобальных классов к паттерну Data Manager.

  • Старое ядро: Работает через «всемогущие» классы (начинаются на C). Например, CUser, CFile, CIBlockElement. Методы возвращают объект CDBResult, из которого данные нужно «вытягивать» через Fetch().
  • Новое ядро (D7): Для каждой таблицы в базе данных создается класс-наследник DataManager (заканчивается на Table). Все методы взаимодействия с базой стандартизированы.

Таблица соответствия (Шпаргалка)

Основные сущности:

СущностьСтарое ядро (Old Core)Новое ядро (D7 ORM)
ПользователиCUser::GetList()\Bitrix\Main\UserTable::getList()
Группы пользователейCGroup::GetList()\Bitrix\Main\GroupTable::getList()
ФайлыCFile::GetByID()\Bitrix\Main\FileTable::getList()
СайтыCSite::GetList()\Bitrix\Main\SiteTable::getList()
Элементы инфоблокаCIBlockElement::GetList()\Bitrix\Iblock\ElementTable::getList()
Разделы инфоблокаCIBlockSection::GetList()\Bitrix\Iblock\SectionTable::getList()
Настройки модулейCOption::GetOptionString()\Bitrix\Main\Config\Option::get()

Сравнение кода на примере выборки

Старый подход (CIBlockElement):

$res = CIBlockElement::GetList(
["SORT" => "ASC"], // Сортировка
["IBLOCK_ID" => 1, "ACTIVE" => "Y"], // Фильтр
false, // Группировка
["nTopCount" => 5], // Лимит
["ID", "NAME", "CODE"] // Поля
);
while($ob = $res->Fetch()) {
echo $ob["NAME"];
}

Новый подход (D7 ORM):

use Bitrix\Iblock\ElementTable;

$res = ElementTable::getList([
'select' => ['ID', 'NAME', 'CODE'], // Что выбираем
'filter' => [ // Условия
'IBLOCK_ID' => 1,
'ACTIVE' => 'Y'
],
'order' => ['SORT' => 'ASC'], // Сортировка
'limit' => 5, // Лимит
'cache' => ['ttl' => 3600] // Кэширование
]);

while ($row = $res->fetch()) {
echo $row['NAME'];
}

Основные операции CRUD в D7

В D7 действия над данными (Create, Read, Update, Delete) приведены к единому стандарту для всех сущностей.

  1. Выборка: ::getList($parameters)
  2. Добавление: ::add($fields)
  3. Обновление: ::update($primaryKey, $fields)
  4. Удаление: ::delete($primaryKey)
  5. Получение по ID: ::getById($id)

Все методы (кроме getList) возвращают объект результата (Result), у которого можно проверить успешность:

$result = UserTable::update(1, ['NAME' => 'Иван']);
if ($result->isSuccess()) {
echo "Данные обновлены";
} else {
print_r($result->getErrorMessages()); // Выведет ошибки валидации
}

Почему D7 лучше?

  1. Скорость: В некоторых случаях ORM строит более оптимизированные SQL-запросы.
  2. IDE Helper: PHPStorm отлично понимает классы D7, подсказывает названия полей и методы. Старое ядро для IDE — это просто "черный ящик".
  3. Runtime-поля: Возможность на лету приклеить (JOIN) одну таблицу к другой без написания сложного SQL.
  4. Валидация: DataManager автоматически проверяет типы данных и длину строк перед сохранением в базу.
  5. Встроенный кеш: Параметр 'cache' => ['ttl' => 3600] позволяет закешировать результат запроса одной строкой.