[Битрикс, Инфоблоки] Множественный фильтр по нескольким значениям списка

29.07.2017

Задача: Отфильтровать и вывести все элементы, у которых не задано значение "Инструмент для бригадира"
Отфильтровать все элементы, у которых не задано значение

Свойство инфоблока CONTRACTOR_GROUP типа список и множественное
Свойство инфоблока CONTRACTOR_GROUP типа список и множественное

В документации для СIBlockElement::GetList()  будет предложено несколько вариантов фильтрации, самое первое, что приходит в голову

'!PROPERTY_CONTRACTOR_GROUP_VALUE' => 'Инструмент для бригадира',
или
'!=PROPERTY_CONTRACTOR_GROUP' => 131,
или
'!PROPERTY_CONTRACTOR_GROUP' => array(131),

Но рабочим без ошибок будет только вариант с подзапросами  Пример №5

//Пример 5: для фильтрации по нескольким значениям множественного свойства, нужно использовать подзапросы.
if(CModule::IncludeModule("iblock")){
  $rs = CIBlockElement::GetList(
     array(),
     array(
     "IBLOCK_ID" => 21,
     array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 21, "PROPERTY_PKE" => 7405))),
     array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 21, "PROPERTY_PKE" => 7410))),
     array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 21, "PROPERTY_PKE" => 7417)))
     ),
     false,
     false,
     array("ID")
  );   while($ar = $rs->GetNext()) {
      echo "<pre>"; print_r($ar); echo "</pre>";
  }
}

Я не словил ошибку, когда у элемента было задано всего одно значение свойства и фильтр выглядел так, он работал

'!PROPERTY_CONTRACTOR_GROUP_VALUE' => 'Инструмент для бригадира',

А когда задал несколько значений, то ошибка проявилась, итоговый пример рабочего фильтра

use \Bitrix\Main\Loader;
use \Bitrix\Main\Localization\Loc; require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php"); if(Loader::includeModule("iblock")) {     $filter = array(
         "IBLOCK_ID" => 49,
         array("!ID" => \CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 49, "PROPERTY_CONTRACTOR_GROUP" => 131))),
    );     $rsElement = CIBlockElement::GetList(false,$filter);     while($row = $rsElement->Fetch()) {         echo "<pre>";
        print_r($row["ID"] . ": ". $row["NAME"]);
        echo "</pre>";
    }
}
49 - это айди инфоблока

131 - этой айди значения свойства "Инструмент для бригадира", его надо исключить отрицанием !ID

Айди значения свойства

Комментарии
Получать ответы на почту
Получать ответы на почту

Разделы
Подписка на статьи
Выберите рассылку
Последние комментарии