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 не будет опубликован.