yous
@yous

Bitrix выборка из инфоблока, как фильтровать по мультисвойству?

PROPERTY_HIT - свойство типа список, содержит Новинка, Акция, Хит и т.д.

фильтрую элементы по значению "Новинка", что бы этих элементов не было в выборке
$arFilter = Array(
    "IBLOCK_ID"=>$IBLOCK_ID,  
    "ACTIVE"=>"Y",
    ">=DATE_CREATE"=>date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT")), mktime(0,0,0,$date)),
    "!PROPERTY_HIT_VALUE"=>array("Новинка"),
  );
  
$productQuery = CIBlockElement::GetList(Array(), $arFilter,false,false, Array("ID","IBLOCK_ID","DATE_CREATE","NAME","PROPERTY_HIT"));


получаю всё равно этот элемент, т.к. у него ещё и "Акция" в свойстве.

array(14) {
  ["ID"]=>
  string(5) "34255"
  ["~ID"]=>
  string(5) "34255"
  ["IBLOCK_ID"]=>
  string(2) "53"
  ["~IBLOCK_ID"]=>
  string(2) "53"
  ["DATE_CREATE"]=>
  string(19) "14.08.2018 14:45:58"
  ["~DATE_CREATE"]=>
  string(19) "14.08.2018 14:45:58"
  ["NAME"]=>
  string(4) "test"
  ["~NAME"]=>
  string(4) "test"
  ["PROPERTY_HIT_VALUE"]=>
  string(10) "Акция"
  ["~PROPERTY_HIT_VALUE"]=>
  string(10) "Акция"
  ["PROPERTY_HIT_ENUM_ID"]=>
  string(2) "91"
  ["~PROPERTY_HIT_ENUM_ID"]=>
  string(2) "91"
  ["PROPERTY_HIT_VALUE_ID"]=>
  string(6) "224294"
  ["~PROPERTY_HIT_VALUE_ID"]=>
  string(6) "224294"
}


если убрать из фильтра PROPERTY_HIT_VALUE вообще, то на выходе будет 2 одинаковых элемента разница будет только в PROPERTY_HIT_VALUE.

как отфильтровать элементы что бы они не попадали под выборку !PROPERTY_HIT_VALUE = Новинка
  • Вопрос задан
  • 743 просмотра
Решения вопроса 1
gromdron
@gromdron
Работаю с Bitrix24
Есть несколько способов это сделать.
Как предложил пользователь Максим можно перевести способ хранения свойств в отдельную таблицу. Это увеличит и скорость поиска и исправит это недоразумение оставшееся со времени инфоблоков версии 1.
Если ничего не хотите делать, а хотите чтобы все работало, то можно использовать SubQuery в CIblockElement

\Bitrix\Main\Loader::IncludeModule('iblock');

$arFilter = Array(
	"IBLOCK_ID" => 2,  
	"ACTIVE"    => "Y",
	"!ID"       => \CIBlockElement::SubQuery("PROPERTY_HIT", array(
		"IBLOCK_ID"          => 2,
		"PROPERTY_HIT_VALUE" => "Новинка",
	))
);
  
$productQuery = \CIBlockElement::GetList(
	[],
	$arFilter,
	false,
	false,
	[
		"ID",
		"IBLOCK_ID",
		"NAME",
		"PROPERTY_HIT"
	]
);

while( $arElement = $productQuery->fetch() )
{
	echo "<pre>";
	var_dump($arElement);
	echo "</pre>";
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Tomio
@Tomio
backend developer (python, php)
Попробуйте перенести хранение свойств в отдельные таблицы (в настройках инфоблока) и повторить выборку по тем же условиям

087ce84fa9.jpg

Не забудьте перед этим сделать бэкап.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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