Задать вопрос
@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?
  • Вопрос задан
  • 13737 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 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
At0m1c
@At0m1c
Разработка сайтов на bitrix
Запишите данные в массив и потом используйте метод GetList(). Удалите из цикла GetByID(), так не надо делать.
while($arElement = $result->fetch()) {
   $arElements[] = $arElement;
}
$res = CIBlockElement::GetList(...
Ответ написан
Ваш ответ на вопрос

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

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