2

在我的问题之前有一点背景:

一个产品有多个标签,比如说 6 个标签,我们想要过滤这 4 个标签中有 2 个存在的产品,但只有那些同时具有这 2 个标签的产品。有没有办法我们可以做到这一点criteria?一个示例过滤器请求如下所示:

选择所有具有(TAG A 和 TAG B)或(TAG C)的产品

标签-A|标签-B,标签-C

我已经尝试过使用EqualsAnyFilter,但它选择了OR它过滤仅具有标签 A 的产品的位置 - 但我希望它是一个AND过滤器。使用只是EqualsFilter似乎不会退回任何产品。

        $criteria = new Criteria();
        $criteria->addAssociation('tags');

        $orFilters = [];

        $orTags = explode(',', 'TAG-A|TAG-B,TAG-C'); // Based on above scenario

        foreach ($orTags as $orTag) {
            $andFilters = [];
            $andTags = explode('|', $orTag);
            
            // Attempt 1 with EqualsAnyFilter
            $andFilters[] = new EqualsAnyFilter('tags.name', $andTags);


            // Attempt 2 with EqualsFilter
            foreach ($andTags as $andTag) {
                $andFilters[] = new EqualsFilter('tags.name', $andTag);
            }


            if ($andFilters) {
                $orFilters[] = new AndFilter($andFilters);
            }
        }

        if ($orFilters) {
            $criteria->addFilter(new OrFilter($orFilters));
        }

但这不会返回所需的结果。有没有办法过滤这样的产品?欢迎任何建议。谢谢!

4

1 回答 1

2

我可以通过使用以下方法ContainsFilter来计算它:

    foreach ($andTags as $andTag) {
        $andFilters[] = new ContainsFilter('tagIds', $andTag);
    }
于 2021-11-28T10:59:15.153 回答