Концепция ORM: DataManager и сущность
ORM D7 строится на Table-классах, наследующих DataManager и определяющих имя таблицы (getTableName()) и карту полей (getMap()). Структура сущности компилируется ядром в объект Entity, объединяя скалярные поля, связи и пользовательские поля UF_* для унифицированной работы через статические методы.
Прогресс хранится в этом браузере. Войдите, чтобы сохранить его в аккаунте.
Что нужно понимать
-
1
DataManager
-
2
Entity (сущность)
-
3
Table-класс
Материалы
Официальная документация
-
Аннотации классов Новая дока
Проверь себя
add() падает с «Table b_vendor_shop_orderlog doesn't exist», хотя таблица в базе создана. Где искать?
В отсутствующем getTableName(). Без него ORM собирает имя таблицы из namespace и имени класса, а не берёт вашу таблицу. Метод должен возвращать реальное имя.
Чем getMap() отличается от getEntity()->getFields() и когда важна разница?
getMap() — первичная конфигурация, которую вы написали. Entity компилируется из неё один раз на хит и дополняется: пользовательскими полями через getUfId(), runtime-полями запроса. Реальный список полей — у Entity, а не у getMap().
Заказчик попросил хранить возраст записи в днях, вы завели ExpressionField, и update() бросил исключение. Почему?
ExpressionField — виртуальное поле, SQL-выражение только для выборки, фильтра и сортировки. Колонки в таблице нет, записать в него нельзя. Если значение нужно хранить, это обычное поле и агент на пересчёт.
Зачем в ядре у одной таблицы b_iblock_element несколько Table-классов?
Чтобы сегментировать одну таблицу: setDefaultScope() добавляет условие к каждому запросу класса, и Element4Table видит только IBLOCK_ID=4. Так работают классы Element{ApiCode}Table инфоблоков.
Не сходится?
Спросите ассистента BXMax: он знает документацию и материалы сайта по этой теме.
Знаете материал лучше?
Предложите ссылку: после проверки она появится в этом разделе.
Войти, чтобы предложить