Bitrix CIBlockElement::SubQuery доступным языком

Хочу поделиться чуть большим описанием применения SubQuery чем это описано в документации. В процессе изучения данного метода я обратил внимание, что в документации вообще сложно и непонятно написано что вообще происходит в этом методе, поэтому решил описать чуть более доступным языком.

Функция оказалась крайне полезной для применения фильтра с обязательным отбором по нескольким вариантам одного свойства. В моем случае нужно было получить только те элементы инфоблока, у которых есть все выбранные в фильтре цвета, т.е. если пользователь выбрал красный и синий цвета в фильтре, то мне нужно было выбрать только те элементы, у которых оба этих цвета есть в значениях свойства “Цвет”.

Итак, теперь по делу. Постараюсь описать простым языком что вообще происходит при вызове метода SubQuery при фильтрации. Этот метод возвращает массив ID элементов инфоблока, которые можно применить как фильтр для нужного нам отбора. поэтому, мы так или иначе должны иметь связи между нашим инфоблоком из которого нужно вывести данные на экран и тем, который участвует в запросе SubQuery. И это в принципе все что делает этот метод. А вот внутри метода есть параметры, которые помогают нам получить этот самый массив ID.

Более подробно опишу на примере из официальной документации битрикса.

<?
//Выбрать авторов написавших книги в 21-ом веке.
if(CModule::IncludeModule('iblock'))
{
  $rsBooks = CIBlockElement::GetList(
    array("NAME" => "ASC"), //Сортируем по имени
    array(
      "IBLOCK_ID" => $AUTHOR_IBLOCK,
      "ACTIVE" => "Y",
      "ID" => CIBlockElement::SubQuery("PROPERTY_AUTHOR", array(
        "IBLOCK_ID" => $BOOK_IBLOCK,
        ">=PROPERTY_PRINT_DATE" => "2000-01-01 00:00:00",
      )),
   ),
   false, // Без группировки
   false,  //Без постранички
   array("ID", "IBLOCK_ID", "NAME") // Выбираем только поля необходимые для показа
  );
  while($arBook = $rsBooks->GetNext())
    echo "<li>", $arBook["NAME"],"\n";
}
?>

В этом примере мы пытаемся получить список элементов из инфоблока с авторами книг $AUTHOR_IBLOCK, при этом отфильтровать этот список нужно по значениям из другого инфоблока с книгами $BOOK_IBLOCK. В втором инфоблоке у каждой книги есть свойства Автор (“PROPERTY_AUTHOR”) и Дата (“PROPERTY_PRINT_DATE”). Вот и получается, что для запроса получения списка элментов из инфоблокоа “Авторов” мы задаем жесткий список ID нужных авторов путем выборки элементов из инфоблока “Книг” с указанием фильтра по дате (“>=PROPERTY_PRINT_DATE” => “2000-01-01 00:00:00”,) и указываем методу в каком свойстве хранится нужная нам связь с авторами, т.е. из какого свойства элмента инфоблока книг нам нужно взять значение и добавить его в массив возвращаемых методом SubQuery значений ID.

2 thoughts on “Bitrix CIBlockElement::SubQuery доступным языком

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Посты по теме

CRON для сайта

Как сделать свой сайт быстрее и эффективнее путем настройки фоновых заданий на CRON

Настройка CRON для VtigerCRM

Для того, чтобы правильно работали фоновые задания в CRM системе обязаельно нужно настроить запуск исполняющего файла по CRON. Для этого в VtigerCRM есть специальные файлы для Linux и Windows серверов Все что нужно сделать, это добваить в планировщик CRON на линксовом сервере выполнение задачи ~/cron/vtigercron.sh с интервалом 1 раз в минуту.

Исправление PHP Parse error: Unclosed '{' on line в Битриксе

Иногда в Битриксе может возникать ошибка “PHP Parse error: Unclosed ‘{‘ on line …”. Обычно такую ошибку можно обнаружить после переезда на новый хостинг. Для испраления этой ошибки необходимо установить значение on параметра short_open_tag в настройках PHP. Делается это в панели управления хостингом.

Что делать если Bitrix MySQL использует все ресурсы процессора

Однажды столкнулся с интересной проблемой, MySQL стал пожирать полностью все ресурсы процессора. Причем “захват” ресурсов происходил плавно с выраженными скачками на графике мониторинга Провалы на графике это ручной перезапуск службы MySQL Причина утечки процессорных ресурсов под MySQL В поисках причины были исследованы длинные запросы к БД и перепробваны различные комбинации настроек MySQL, но ничего не […]

Как изменить язык сайта Битрикс для раздела или страницы

Легкий способ локально изменить ящык сайта Bitrix для отдельных страниц или разделов без применения механизма многосайтовости.