Bitrix ORM «правильный» getList с OneToMany?

Пытаюсь собрать "правильный" getList.
Есть 2 сущности связанные через OneToMany и Reference с другой стороны (связь множественная).
Делаю выборки getList()->fetch()/->fetchAll()/->fetchCollection();
Все хорошо пока в запрос не добавляется limit.
Если у сущности 2 связанных элемента то на нее будет "потрачено" 2 "лимита". И не важно каким образом будет обработан результат.
Грубо говоря если у первого элемента будет 2 дочерних то в выборку попадут 4 строки вместо 5ти (2 строки ушли на первых элемент).

Я смог собрать запрос при помощи ExpressionField и fetch_data_modification. Суть тут заключается в том что я динамически собираю id дочерних элементов в строку, а затем в fetch_data_modification доп запросом получаю эти объекты.
С таким костылем limit работает корректно но: 1) это плохо пахнет, 2) функцию модификации придется писать ко всем связанным сущностям.

Как это делать правильно? Оно вообще умеет правильно работать с limit и OneToMany одновременно?

Пример getList
$arSelect   =   [
	'*',
    'SPECIALIZATION'
];
$arOrder    =   ['ID'=>'ASC'];
$limit      =   2;

$obResult   =   \K\Core\User\VerificationTable::getList([
    'select'=>  $arSelect,
    'order' =>  $arOrder,
    'limit' =>  $limit
])->fetchCollection();

echo count($obResult);

Результатом будет 1, а не 2.

Маппинг базовой сущности VerificationTable
public static function getMap():array{
		return  [
			(new Entity\IntegerField('ID'))
				->configurePrimary()
				->configureAutocomplete(),
			(new OneToMany(
				'SPECIALIZATION',
				'\K\Core\User\Verification\SpecializationTable',
				'VERIFICATION'
			)),
		];
	}


Маппинг подчиненной сущности SpecializationTable
public static function getMap():array{
		return  [
			(new Entity\IntegerField('ID'))
				->configurePrimary()
				->configureAutocomplete(),
			(new Entity\IntegerField('VERIFICATION_ID'))
				->configureRequired(),
			(new Entity\ReferenceField('VERIFICATION',
				'\K\Core\User\VerificationTable',
				['=this.VERIFICATION_ID'=>'ref.ID']
			))->configureTitle(self::getMessage('K_CORE_FIELD_VERIFICATION_TITLE')),
		];
	}
  • Вопрос задан
  • 1511 просмотров
Пригласить эксперта
Ответы на вопрос 1
@BookaZoid
Мне помогло исключение поля связи из getList и далее дозаполнение его через $collection->fill(['FIELDNAME']);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы