Bitrix开发:如何在$arFilter中设置多值属性元素数量筛选条件
Bitrix 信息块(IBlock)多值属性关联数筛选方案
实现逻辑
Bitrix 内置的 CIBlockElement::GetList 方法默认没有提供直接统计多值属性关联记录数的筛选参数,我们可以通过自定义 SQL 逻辑注入到筛选条件中实现需求。
具体实现步骤
- 第一步:先获取目标多值属性的ID(提前查询可提升后续筛选的执行效率)
- 第二步:将统计关联数的子查询写入
$arFilter的SQL逻辑筛选段
代码示例
写法1(直接嵌套查询,无需提前查属性ID)
// 替换为实际信息块ID $iblockId = 1; // 替换为实际多值属性代码 $multiplePropCode = 'YOUR_PROP_CODE'; $arFilter = [ 'IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y', [ 'LOGIC' => 'SQL', 'WHERE' => '(SELECT COUNT(*) FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID = e.ID AND IBLOCK_PROPERTY_ID = ( SELECT ID FROM b_iblock_property WHERE CODE = "'.$multiplePropCode.'" AND IBLOCK_ID = '.(int)$iblockId.' )) < 10' ] ]; // 执行查询 $rsElement = CIBlockElement::GetList( ['SORT' => 'ASC'], $arFilter, false, false, ['ID', 'NAME'] );
写法2(提前查属性ID,性能更优)
$iblockId = 1; $multiplePropCode = 'YOUR_PROP_CODE'; // 提前查询多值属性ID $propRes = CIBlockProperty::GetList([], [ 'IBLOCK_ID' => $iblockId, 'CODE' => $multiplePropCode ]); $propId = (int)$propRes->Fetch()['ID']; $arFilter = [ 'IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y', [ 'LOGIC' => 'SQL', 'WHERE' => '(SELECT COUNT(*) FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID = e.ID AND IBLOCK_PROPERTY_ID = '.$propId.') < 10' ] ]; $rsElement = CIBlockElement::GetList( ['SORT' => 'ASC'], $arFilter, false, false, ['ID', 'NAME'] );
注意事项
如果你的Bitrix版本不支持
LOGIC => SQL的写法,也可以先查询所有符合基础条件的元素,遍历每个元素的多值属性值数量再做过滤,该写法兼容性更高,但仅适合数据量较小的场景。
内容的提问来源于stack exchange,提问作者Александр Маринов
相关产品推荐
相关产品推荐

