Дата последнего изменения: 27.10.2020
Когда в объекте заполнены не все поля, и вам нужно дозаполнить их, не следует применять следующий подход:
// изначально у нас есть только ID и NAME $author = \Bitrix\Main\Test\Typography\EO_Author::wakeUp( ['ID' => 17, 'NAME' => 'Name 17'] ); // мы хотим дозаписать LAST_NAME, довыбрав его из базы данных $row = \Bitrix\Main\Test\Typography\AuthorTable::getByPrimary($author->getId(), ['select' => ['LAST_NAME']] )->fetch(); // добавление значения в объект $author->setLastName($row['LAST_NAME']);
В таком случае значение будет считаться вновь установленным, а не актуальным, что теоретически может привести к непредсказуемым коллизиям в дальнейшей работе с объектом.
Правильно будет воспользоваться именованным методом объекта fill:
// изначально у нас есть только ID и NAME $author = \Bitrix\Main\Test\Typography\EO_Author::wakeUp( ['ID' => 17, 'NAME' => 'Name 17'] ); // добавляем LAST_NAME из базы данных $author->fillLastName();
Кроме именованных методов, есть и универсальный. И он предоставляет значительно больше возможностей, чем другие универсальные методы:
$author = \Bitrix\Main\Test\Typography\EO_Author::wakeUp(17); // заполнение нескольких полей $author->fill(['NAME', 'LAST_NAME']); // заполнение всех незаполненных на данный момент полей $author->fill(); // заполнение полей по маске, например все незаполненные скалярные поля $author->fill(\Bitrix\Main\ORM\Fields\FieldTypeMask::SCALAR); // незаполненные скалярные и пользовательские поля $author->fill( \Bitrix\Main\ORM\Fields\FieldTypeMask::SCALAR | \Bitrix\Main\ORM\Fields\FieldTypeMask::USERTYPE ); /* * Маски бывают следующие: * * SCALAR - скалярные поля (ORM\ScalarField) * EXPRESSION - выражения (ORM\ExpressionField) * USERTYPE - пользовательские поля * REFERENCE - отношения 1:1 и N:1 (ORM\Fields\Relations\Reference) * ONE_TO_MANY - отношения 1:N (ORM\Fields\Relations\OneToMany) * MANY_TO_MANY - отношения N:M (ORM\Fields\Relations\ManyToMany) * * FLAT - скалярные поля и выражения * RELATION - все отношения * * ALL - абсолютно все доступные поля */
Если вам нужно дозаполнить несколько объектов, то категорически не рекомендуется выполнять эту команду в цикле - это приведет к большому количеству запросов к базе данных. Для работы с несколькими объектами одного типа одновременно следует использовать аналогичный метод Коллекции.