ragnar_ok
@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();
  • Вопрос задан
  • 8523 просмотра
Решения вопроса 1
@Snatch87
Битриксоид по принуждению
В runtime Вы можете передать сколько угодно объектов references.
Приведу не большой пример, только я использую не гет листы, объект Query:
$query  = \Entities\Marketing\PostingTmpTable::query()
             ->registerRuntimeField('CONTACT', [
                 'data_type' => '\Bitrix\Sender\ContactTable',
                 'reference' => [
                     '=this.CONTACT_ID' => 'ref.ID',
                 ],
//                 'join_type' => 'right'
             ])
             ->registerRuntimeField('PROPERTY', [
                'data_type' => $hlBlockEntity,
                'reference' => [
                    '=this.CONTACT.CODE' => 'ref.UF_EMAIL'
                ],
//                 'join_type' => 'right'
            ])
        ;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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