Задать вопрос
@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
  • Вопрос задан
  • 3193 просмотра
Подписаться 3 Простой 4 комментария
Решения вопроса 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
full-stack web dev
Если хотим работать с 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
Ответ написан
Ваш ответ на вопрос

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

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