ragnar_ok
@ragnar_ok

Как сократить количество запросов для получения свойства «Справочник»?

Получаю свойство "Справочник". Количество запросов равняется количеству итераций цикла:
foreach ($arResult['ITEMS'] as $index => $arItem) {
    $resultArray = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity('Entity')->getDataClass()::getList([
        'select' => ['UF_NAME'],
        'filter' => ['UF_XML_ID' => $arItem['PROPERTIES']['PROP']['VALUE']],
    ]);
    while ($rowArray = $resultObj->fetch()) {
        $arResult['ITEMS'][$index]['PROPERTIES']['PROP']['UF_NAME'] = $resultArray['UF_NAME'];
    }
}

Как на примере этого кода сократить количество запросов и получить все значения в:
$arResult['ITEMS'][$index]['PROPERTIES']['PROP']['UF_NAME']
  • Вопрос задан
  • 65 просмотров
Решения вопроса 1
@Snatch87
Битриксоид по принуждению
Для начала Вам нужно собрать массив всех xml_id по которым вы будете искать

$xmlIds = [];

foreach ($arResult['ITEMS'] as $index => $arItem) {
    $xmlIds[] = $arItem['PROPERTIES']['PROP']['VALUE']];
}

На всякий уберем дубли:
$xmlIds = array_unique($xmlIds);

Найти найти все записи из HL по с UF_XML_ID
if(!empty($xmlIds)){
	$resultArray = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity('Entity')->getDataClass()::getList([
        'select' => ['UF_NAME'],
        'filter' => ['@UF_XML_ID' => $xmlIds],
    ]);
    
	while ($rowArray = $resultObj->fetch()) {
	    $arRef[$resultArray['UF_XML_ID']] = $resultArray['UF_NAME'];
	}	
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Если прям тупо в лоб:
$arRef = [];
$resultArray = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity('Entity')->getDataClass()::getList([
        'select' => ['UF_NAME'],
        'filter' => [],
    ]);
while ($rowArray = $resultObj->fetch()) {
    $arRef[$resultArray['UF_XML_ID']] = $resultArray['UF_NAME'];
}
foreach ($arResult['ITEMS'] as $index => $arItem) {
    $arResult['ITEMS'][$index]['PROPERTIES']['PROP']['UF_NAME'] = $arRef[$arItem['PROPERTIES']['PROP']['VALUE']];
}
Ответ написан
Ваш ответ на вопрос

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

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