@johan1997

Как получить все св-ва элементов в ORM используя runtime?

Делаю запрос таким образом, получаю только 1 св-во, как получить все?
$el_res = ElementTable::getList([
	'select' => [
		'ID',
		'NAME',
		'DETAIL_PICTURE',
		'PRICE' => 'ELEMENT_PRICE.PRICE',

		'PROP_ID' => 'PROPERTY.ID',
		'PROP_NAME' => 'PROPERTY.NAME',
		'PROP_CODE' => 'PROPERTY.CODE',
		'PROP_VALUE' => 'ELEMENT_PROPERTY.VALUE',
	],
	'filter' => ['=ACTIVE' => 'Y', 'IBLOCK_ID' => IB_ID__CATALOG],
	'runtime' => [
		new Reference(
			'ELEMENT_PRICE',
			PriceTable::class,
			Join::on('this.ID', 'ref.PRODUCT_ID'),
		),
		new Reference(
			'ELEMENT_PROPERTY',
			ElementPropertyTable::class,
			Join::on('this.ID', 'ref.IBLOCK_ELEMENT_ID'),
		),
		new Reference(
			'PROPERTY',
			PropertyTable::class,
			Join::on('this.ELEMENT_PROPERTY.IBLOCK_PROPERTY_ID', 'ref.ID')
		),
		new Reference(
			'PROPERTY_ENUMERATION',
			PropertyEnumerationTable::class,
			Join::on('this.ELEMENT_PROPERTY.VALUE', 'ref.ID')
		),
	],
]);
while($ob = $el_res->fetch())
{
	$arResult['ITEMS'][$ob['ID']] = [
		'ID' => $ob['ID'],
		'NAME' => $ob['NAME'],
		'DETAIL_PICTURE' => CFile::GetPath($ob['DETAIL_PICTURE']),
		'PRICE' => $ob['PRICE'],
		'PROPS' => [
			$ob['PROP_ID'] => [
				'NAME' => $ob['PROP_NAME'],
				'CODE' => $ob['PROP_CODE'],
				'VALUE' => $ob['PROP_VALUE'],
			]
		]
	];
}

Результат:
62be8fcde3e78996613849.png
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
@Firsov36
full-stack web developer
Вы массив свойств перезаписываете одним массивом.

можно поправить, например так:

while ($ob = $el_res->fetch()) {
    $props[$ob['PROP_ID']] = [
        'NAME' => $ob['PROP_NAME'],
        'CODE' => $ob['PROP_CODE'],
        'VALUE' => $ob['PROP_VALUE'],
    ];
    
    $arResult['ITEMS'][$ob['ID']] = [
        'ID' => $ob['ID'],
        'NAME' => $ob['NAME'],
        'PROPS' => $props
    ];
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Starina_js
@Starina_js
Веб-программист
Если хотим работать с orm инфоблоков, то сначала в настройках инфоблока пропишите символьный код api

Если вам нужно получить все свойства инфоблока то можно так
\Bitrix\Iblock\PropertyTable::getList([
            'select' => [
                'CODE',
                'NAME',
            ],
            'filter' => [
                'IBLOCK_ID' => $iblockId,
            ],
            'cache' => [
                'ttl' => 3600
            ],
        ])->fetchAll();

Вместо fetchall() можно fetchCollection() - для работы с коллекциями

Если мы хотим получить элементы со значениями нужных свойств, то можно допустим так
\Bitrix\Iblock\Elements\ElementCalendarListTable::getList([
            'select' => [
                'NAME',
                'ID',
                'PROP_TEXT_VALUE' => 'PROP_TEXT.VALUE',  //строка
                'PROP_CITY_VALUE' => 'PROP_CITY.ITEM.VALUE',  // список
                'PROP_COURSE_' => 'PROP_COURSE_ELEMENT.ELEMENT', // свойство с привязкой элемента
            ],
            'cache' => [
                'ttl' => 3600
            ],
        ])->fetchCollection()

ElementCalendarListTable - это часть из названия символьного кода api и ElementTable

Обратите внимание на select и как указываются свойства.
Битрикс автоматом связывает таблицы, если они правильно в запросе прописаны

https://dev.1c-bitrix.ru/learning/course/index.php...
Посмотрите тут про типы свойств и как их можно получить и как формировать запросы. (там это указано под спойлером)

Еще значения из свойств элемента можно получить так (как в справке)
$iblock = \Bitrix\Iblock\Iblock::wakeUp($iblockId);
$elements = $iblock->getEntityDataClass()::getList([
    'select' => ['ID', 'SOME_FIELD', 'ANOTHER_FIELD.ELEMENT']
])->fetchCollection();

foreach ($elements as $element)
{
    echo $element->getSomeField()->getValue();
    echo $element->getAnotherField()->getElement()->getTitle();
}

Тута https://dev.1c-bitrix.ru/learning/course/index.php...

Это более простые способы получения значений из свойств инфоблоков.

Есть еще вариант джойнить таблицы, делается через runtime
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы