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) приведены к единому стандарту для всех сущностей.
- Выборка:
::getList($parameters) - Добавление:
::add($fields) - Обновление:
::update($primaryKey, $fields) - Удаление:
::delete($primaryKey) - Получение по ID:
::getById($id)
Все методы (кроме getList) возвращают объект результата (Result), у которого можно проверить успешность:
$result = UserTable::update(1, ['NAME' => 'Иван']);
if ($result->isSuccess()) {
echo "Данные обновлены";
} else {
print_r($result->getErrorMessages()); // Выведет ошибки валидации
}
Почему D7 лучше?
- Скорость: В некоторых случаях ORM строит более оптимизированные SQL-запросы.
- IDE Helper: PHPStorm отлично понимает классы D7, подсказывает названия полей и методы. Старое ядро для IDE — это просто "черный ящик".
- Runtime-поля: Возможность на лету приклеить (JOIN) одну таблицу к другой без написания сложного SQL.
- Валидация: DataManager автоматически проверяет типы данных и длину строк перед сохранением в базу.
- Встроенный кеш: Параметр
'cache' => ['ttl' => 3600]позволяет закешировать результат запроса одной строкой.