Задать вопрос
@ragnar_ok

Bitrix ORM: Как использовать JOIN, чтобы сократить количество запросов?

Получаю элементы инфоблока и значение их свойства типа "Список".

use Bitrix\Iblock\ElementTable;
use Bitrix\Iblock\PropertyEnumerationTable;
use Bitrix\Iblock\ElementPropertyTable;

$idArray = [];
$resultObj = ElementTable::getList([
	'select' => ['ID'],
	'filter' => ['IBLOCK_ID' => 1, "IBLOCK_SECTION_ID" => 1, 'ACTIVE'=>'Y'],
]);
while ($rowArray = $resultObj->fetch()) {
	$idArray[] = $rowArray['ID'];
}

$idElementArray = [];
$resultObj = ElementPropertyTable::getList([
	'select' => ['VALUE'],
	'filter' => [
            'IBLOCK_ELEMENT_ID' => $idArray,
            'IBLOCK_PROPERTY_ID' => 1 
        ], 
]);
while ($rowArray = $resultObj->fetch()) {
	$idElementArray[] = $rowArray['VALUE'];
}

$resultObj = PropertyEnumerationTable::getList([
	'select' => ['VALUE'],
	'filter' => ['ID' => $idElementArray],
]);
while ($rowArray = $resultObj->fetch()) {
	$arResult[$rowArray['ID']] = $rowArray['VALUE'];
}


Как на примере этого кода использовать JOIN, чтобы сократить количество запросов?

UPD:
В итоге получилось так. Оптимизировать не получится?

$idArray = [];
    $resultObj = ElementTable::getList([
        'select' => ['ELEMENT_PROPERTY.VALUE'],
        'filter' => ['IBLOCK_ID' => 1, "IBLOCK_SECTION_ID" => 1, 'ACTIVE'=>'Y'],
        'runtime' => [
            new Reference(
                'ELEMENT_PROPERTY',
                ElementPropertyTable::class,
                Join::on('this.ID', 'ref.IBLOCK_ELEMENT_ID')
            ),
        ],
    ]);
    while ($rowArray = $resultObj->fetch()) {
        $idArray[] = $rowArray['IBLOCK_ELEMENT_ELEMENT_PROPERTY_VALUE'];
    }

    $resultArray = PropertyEnumerationTable::getList([
        'select' => ['VALUE'],
        'filter' => ['ID' => array_unique($idArray)],
    ])->fetchAll();
  • Вопрос задан
  • 8972 просмотра
Подписаться 2 2 комментария
Подписчики вопроса 2 К ответам на вопрос (0)