@faragly

Как сделать сложный getList запрос в 1С-Битрикс?

Здравствуйте! Есть highloadblock элементы, в поле UF_ELEMENT_ID хранится ид элемента инфоблока. Вопрос следующий - как сделать сложный запрос getList выборки из highloadblock'а, чтобы я мог сразу получить некоторые поля (название, свойства) привязанного элемента инфоблока? В данный момент выборка делается
use Bitrix\Highloadblock as HL;
Bitrix\Main\Loader::includeModule('highloadblock');

$hlblock = HL\HighloadBlockTable::getById($hlBlockId)->fetch(); // $hlBlockId = 11
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$dataClass = $entity->getDataClass();
$result = $dataClass::getList([
	"select" => array('*'), //выбираем все поля
]);
$arCache = [];
while($arElement = $result->fetch())
{
	// тут у меня каждый элемент обрабатывается, делаю запрос и кэширую, чтобы обращаться 1 раз
	if (!array_key_exists($arElement["UF_ELEMENT_ID"], $arCache))
	{
		$res = CIBlockElement::GetByID($arElement["UF_ELEMENT_ID"]);
		$arCache[$arElement["UF_ELEMENT_ID"]] = $res->Fetch();
	}
	// тут собираю все в один массив
}

Возможно ли свести это все в один getList?
  • Вопрос задан
  • 7121 просмотр
Решения вопроса 1
  • Примерно так, если нужны поля инфоблока:

    use Bitrix\Main\Application;
    use Bitrix\Highloadblock\HighloadBlockTable;
    use Bitrix\Main\Loader;
    
    Loader::includeModule('highloadblock');
    Loader::includeModule('iblock');
    
    $hlBlockId = 2;
    
    $hlblock = HighloadBlockTable::getById($hlBlockId)->fetch();
    
    /** @var \Bitrix\Main\Entity\Base $entity */
    $entity = HighloadBlockTable::compileEntity($hlblock);
    
    /** @var \Bitrix\Main\Entity\DataManager $dataClass */
    $dataClass = $entity->getDataClass();
    
    Application::getConnection()->startTracker();
    
    $result = $dataClass::getList([
        'select' => array(
            'UF_ELEMENT_ID',
            'NAME' => 'ELEMENT.NAME',
            'CODE' => 'ELEMENT.CODE',
            'DETAIL_PICTURE' => 'ELEMENT.DETAIL_PICTURE',
        ),
        'runtime' => array(
            'ELEMENT' => array(
                'data_type' => '\Bitrix\Iblock\ElementTable',
                'reference' => array(
                    '=this.UF_ELEMENT_ID' => 'ref.ID'
                ),
                'join_type' => 'inner'
            ),
        ),
        'limit' => 10,
    ]);
    
    // Можно смотреть сформированный запрос
    echo '<pre>', $result->getTrackerQuery()->getSql(), '</pre>';
    
    while ($row = $result->fetch()) {
        echo '<pre>';print_r($row);echo '</pre>';
    }


    Со свойства чуть сложнее.

    P.S. некоторые примеры с использованием ORM D7
    Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы