Предположим, что из ИБ нужно вывести те элементы, у которых значение свойства "a" больше значения свойства "b". (a и b это числа)
$arOrder = Array( "SORT"=>"DESC" );
$arFilter = array( "IBLOCK_ID" => $IBLOCK_ID, "ACTIVE"=>'Y');
$arGroupBy = false;
$arNavStartParams = false;
$arSel ectFields = array('*', 'PROPERTY_a', 'PROPERTY_b' );
$res = CIBlockElement::GetList( $arOrder, $arFilter, $arGroupBy, $arNavStartParams, $arSelectFields );
$res->NavStart(10);
while( $ar_res = $res->GetNext() ) {
if ( $ar_res['PROPERTY_A_VALUE'] > $ar_res['PROPERTY_B_VALUE'] ) {
echo $ar_res['NAME'];
}
}
$res->NavPrint();
Запрос к БД в этом случае выглядел бы примерно так
SELECT b_iblock_element_property.IBLOCK_ELEMENT_ID,
b_iblock_element.NAME ,
b_iblock_element_property.VALUE,
b_iblock_element_property.IBLOCK_PROPERTY_ID
[..др. элементы..]
FR OM b_iblock_element,
b_iblock_element_property
WHERE b_iblock_element_property.IBLOCK_ELEMENT_ID = b_iblock_element.ID and b_iblock_element.IBLOCK_ID = [ID ИБ]
and b_iblock_element_property.VALUE IN
(select max(b_iblock_element_property.VALUE)
fr om b_iblock_element_property wh ere b_iblock_element_property.IBLOCK_ELEMENT_ID = b_iblock_element.ID )
and b_iblock_element_property.IBLOCK_PROPERTY_ID = [ID того свойства которого нужно, в данном случае свойства "a"]
VALUE из таблицы b_iblock_element_property это и есть значение свойства, которое нужно сравнивать с другим значением в этой же колонке.
Эта задача, конечно же, довольно частного характера, но может быть возможно как-нибудь расширить функционал фильтра со сложной логикой?
Самое наивное, наверное, предположение это сравнивать так:
$arFilter = array( "IBLOCK_ID" => $IBLOCK_ID, ">PROPERTY_a"=>"PROPERTY_b" );
Работать с API несомненно удобнее чем придумывать sql запросы.
Уважаемые разработчики, ваше мнение, насколько целесообразно вводить сравнение свойств инфоблока в API, используя его непосредственно в фильтре?
У кого-нибудь есть альтернативный вариант решения данной задачи через API?