Получаю элементы инфоблока и значение их свойства типа "Список".
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();