You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Александр Маринов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:36:03