just_guy95
@just_guy95
Bitrix 1C

Почему при выборке данных через D7 ElementTable::getList свойство инфоблока «привязка к элементу» дублирует данные?

Добрый вечер!
Такая конструкция:
$objListOfDoctors = \Bitrix\Iblock\Elements\ElementDoctorsAPITable::getList([
		'select' => [
			'ID',
			'NAME',
			'GETSERVICESLIST_' => 'GETSERVICESLIST',
		],
		'filter' => ['ID' => $arParams['LIST_OF_DOCTOR'], 'ACTIVE' => 'Y'],
		'order' => ['DATE_CREATE' => 'ASC'],
		//'group' => ['NAME']
	])->fetchAll();

	foreach ($objListOfDoctors as $key => $value) { ?>
		<pre>
		<? var_dump($value) ?>
		</pre>
		<? }

Результат:
63f657aed222d652521492.png

Вопрос:
Можно ли получить сгруппированные данные в один массивбез костылей силами битрикса как в getList старого ядра?
GETSERVICESLIST — свойство инфоблока с типом «привязка к элементу». Я знаю, что в целом это нормальное поведение при выборке элементов инфоблока через getList, но нашел в инете информацию, что если переместить свойства в отдельную таблицу, то после этого getList отдает свойства со значениями уже сформированные в 1 массиве и не дублирует их. Но почему getList от D7 работает в моем случае так.

------------------------------------------------------------------------------

Просто приписка:
Исключительно для эксперимента протестил getList старого ядра, конструкция:
$arSelect = array("ID", "NAME", "DATE_ACTIVE_FROM", "PROPERTY_GETSERVICESLIST");
	$arFilter = array('IBLOCK_ID' => $arParams['IBLOCK_ID'], 'ID' => $arParams['LIST_OF_DOCTOR']);
	$res = CIBlockElement::GetList(array(), $arFilter, false, array("nPageSize" => 50), $arSelect);
	while ($ob = $res->GetNextElement()) {
		$arFields = $ob->GetFields(); ?>
		<pre>
<? var_dump($arFields) ?>
</pre>
<? }

Результат(то, что нужно мне):
63f6599142396993694178.png
  • Вопрос задан
  • 2052 просмотра
Решения вопроса 2
no_one_safe
@no_one_safe
В первом случае у вас 1 запрос в бд с присоединением таблицы множественного свойства (PROPERTY_GETSERVICESLIST). Результат ожидаемый - сколько значений у одного элемента, столько и результатов.

Во втором случае у вас 100500 запросов к бд и группировка свойств под капотом CIBlockElement::GetList.

Предпочтительнее выбирать через D7 и группировать элементы, всяко быстрее будет.
Ответ написан
@KukuRuku
Из документации:

https://dev.1c-bitrix.ru/learning/course/index.php...
В примере выше видно принципиальное преимущество объектной модели перед массивами. Несмотря на то, что фактически выбрано две записи (для одного Издателя нашлось две книги), по факту из результата получается только один объект. Система самостоятельно распознала этот случай и склеила все книги издателя в одну Коллекцию.


$objListOfDoctors = ElementDoctorsAPITable::getList([
    'select' => [
        'ID',
        'NAME',
        'SERVICESLIST.ELEMENT',
    ],
    'filter' => ['ID' => $arParams['LIST_OF_DOCTOR'], 'ACTIVE' => 'Y'],
    'order'  => ['DATE_CREATE' => 'ASC'],
])->fetchCollection();

foreach ($objListOfDoctors as $doctor) {
    foreach ($doctor->getServiceslist() as $service) {
        var_dump($service->getElement()->getId());
        var_dump($service->getElement()->getName());
        ...
    }
    // или
    var_dump($doctor->getServiceslist()->getIdList());
}


Сложности начнутся, если добавить limit в выборку данных. Но для этого есть метод
\Bitrix\Main\ORM\Query\QueryHelper::decompose()
https://dev.1c-bitrix.ru/learning/course/index.php...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@toorr2p
https://github.com/Cleverscript
А можно пример с decompose ? В документации Басыров не удосужился написать пример...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы