Давно хотел написать об этом.
Часто требуется, например, выбрать из секции все элементы, исключив элементы некоторых подразделов.
Не зная одной "фишки" битрикса, мы обычно пишем примерно так:
С точки зрения документации и здравого смысла все кажется правильным.
Но в результатах запроса с таким фильтром все равно будут элементы из тех подразделов, которые были указаны в отрицательном условии.
А вот "фишка" битрикса и корректный вариант.
[spoiler]
Казалось бы, мы просто вложили отрицательное условие в массив.
Однако, генерируемый SQL-запрос будет совсем другого вида, а в результате не будет элементов тех подразделов, которые мы хотели бы пропустить при выборке.
С одной стороны, это кажется багом и неочевидным решением. К тому же удлиняет код.
С другой стороны, вынесение условий в подмассивы уменьшает шанс затирания условий (такое бывало на практике).
Покопаться в сгенерированных SQL и их отличиях на досуге - предоставлю читателю.
Часто требуется, например, выбрать из секции все элементы, исключив элементы некоторых подразделов.
Не зная одной "фишки" битрикса, мы обычно пишем примерно так:
$arNotShowSections = array(...); $arFilter = array( 'IBLOCK_ID' => $arParams['IBLOCK_ID'], 'SECTION_ID' => $arParams['SECTION_ID'], '!SECTION_ID' => $arNotShowSections, ); |
С точки зрения документации и здравого смысла все кажется правильным.
Но в результатах запроса с таким фильтром все равно будут элементы из тех подразделов, которые были указаны в отрицательном условии.
А вот "фишка" битрикса и корректный вариант.
[spoiler]
$arFilter = array( 'IBLOCK_ID' => $arParams['IBLOCK_ID'], 'SECTION_ID' => $arParams['SECTION_ID'], 0 => array('!SECTION_ID' => $arNotShowSections), ); |
Казалось бы, мы просто вложили отрицательное условие в массив.
Однако, генерируемый SQL-запрос будет совсем другого вида, а в результате не будет элементов тех подразделов, которые мы хотели бы пропустить при выборке.
С одной стороны, это кажется багом и неочевидным решением. К тому же удлиняет код.
С другой стороны, вынесение условий в подмассивы уменьшает шанс затирания условий (такое бывало на практике).
Покопаться в сгенерированных SQL и их отличиях на досуге - предоставлю читателю.