Как используя ORM Bitrix вывести определенные разделы и вложенные в них элементы?

Задача - вывести определенные разделы и расположенные в них элементы используя ORM Bitrix в следующей виде:
Название раздела 1
  1. Документ 1
  2. Документ 2

Название раздела N
  1. Документ N
  2. Документ N


Условия - Один элемент может находится в разных разделах. Уровень вложенности разделов может быть разный. Выполнить выборку из БД желательно за один запрос.

Реализация
Используем ORM Bitrix
use \Bitrix\Main\Loader;
Loader::includeModule('iblock');

$iblockId = 7; // ID Инфоблока 
$sections = array(298, 4);  // ID необходимых разделов
$elementId = 29; // ID элемента - для проверки в каких разделах состоит элемент

// API инфоблока - Docs 
// Попробуем реализовать через getList
$elements = \Bitrix\Iblock\Elements\ElementDocsTable::getList([
    // Чтобы получить все разделы элемента, в select указываем SECTIONS
    // Из SECTIONS выберем только ID, NAME и добавим алиасы SECTION_
    'select' => ['ID', 'NAME', 'IBLOCK_ID', 'SECTION_ID'=>'SECTIONS.ID', 'SECTION_NAME'=>'SECTIONS.NAME'],
    'filter' => [
        'IBLOCK_ID' => $iblockId, // ID инфоблока
        'SECTIONS.ID' => $sections, // ID необходимых разделов
        // 'ID' => $elementId, // Для проверки в каких разделах состоит элемент
    ],
    'limit' => '20', // Количество элементов
])->fetchAll();

В результаты получаем следующий массив
Один элемент с 'ID' => 29 состоит в двух разделах, разного уровня вложенности. Ключи в массиве 0 и 2.
Array(
    [0] => Array
        (
            [ID] => 29
            [NAME] => Федеральный закон от 25.12.2008 №273-ФЗ "О противодействии коррупции"
            [IBLOCK_ID] => 7
            [SECTION_ID] => 4
            [SECTION_NAME] => Противодействие коррупции
        )
    [1] =>  Array
        (
            [ID] => 36
            [NAME] => Положение о комиссии по урегулированию споров и предотвращению конфликта интересов
            [IBLOCK_ID] => 7
            [SECTION_ID] => 4
            [SECTION_NAME] => Противодействие коррупции
        )
    [2] => Array
        (
            [ID] => 29
            [NAME] => Федеральный закон от 25.12.2008 №273-ФЗ "О противодействии коррупции"
            [IBLOCK_ID] => 7
            [SECTION_ID] => 298
            [SECTION_NAME] => Архив
        )
    [3] => Array
        (
            [ID] => 29
            [NAME] => Постановление правительства от 05.07.2013 №568 "О распространении ограничений"
            [IBLOCK_ID] => 7
            [SECTION_ID] => 298
            [SECTION_NAME] => Архив
        )
)


Вопрос - Как сформировать результат $elements в массив следующего вида?
Желательно в ответе написать реализацию.
Array
(
    [0] => Array
        (
            [SECTION_ID] => 29
            [SECTION_NAME] => Раздел 1
            [ELEMENTS] => Array
                (
                    [0] => Array
                        (
                            [ID] => 11
                            [ELEMENT_NAME] => Документ 1
                        )

                    [1] => Array
                        (
                            [ID] => 223
                            [ELEMENT_NAME] => Документ 2
                        )

                )

        )

    [1] => Array
        (
            [SECTION_ID] => 30
            [SECTION_NAME] => Раздел N
            [ELEMENTS] => Array
                (
                    [0] => Array
                        (
                            [ID] => 44
                            [ELEMENT_NAME] => Документ N
                        )

                    [1] => Array
                        (
                            [ID] => 323
                            [ELEMENT_NAME] => Документ N
                        )

                )

        )
)
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Drayde
while ($element = $elements->fetch())
{
	$sectionId = $element['SECTION_ID'];

	$result[$sectionId] = [
		'SECTION_ID' => $sectionId,
		'SECTION_NAME' => $element['SECTION_NAME'],
	];

	$result[$sectionId]['ELEMENTS'][] = [
		'ID' => $element['ID'],
		'ELEMENT_NAME' => $element['NAME'],
	];
}
Ответ написан
Ваш ответ на вопрос

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

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