无法在 Shopware 6 中按多个标签过滤产品
Cannot filter products by multiple tags in Shopware 6
我的问题之前的一些背景知识:
一个产品有多个标签,假设有 6 个标签,我们想过滤出这 4 个标签中有 2 个存在的产品,但只有那些同时具有这 2 个标签的产品。有没有办法使用 criteria
来做到这一点?示例过滤器请求如下:
Select 所有具有(TAG A 和 TAG B)或(TAG C)的产品
TAG-A|TAG-B,TAG-C
我已经尝试过使用 EqualsAnyFilter
,但它的选择类似于 OR
,它过滤只有标签 A 的产品 - 但我希望它是一个 AND
过滤器。仅使用 EqualsFilter
似乎没有 returning 任何产品。
$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));
}
但这并不是return想要的结果。有没有办法像这样过滤产品?欢迎提出任何建议。谢谢!
我可以通过使用 ContainsFilter
来计算如下:
foreach ($andTags as $andTag) {
$andFilters[] = new ContainsFilter('tagIds', $andTag);
}
我的问题之前的一些背景知识:
一个产品有多个标签,假设有 6 个标签,我们想过滤出这 4 个标签中有 2 个存在的产品,但只有那些同时具有这 2 个标签的产品。有没有办法使用 criteria
来做到这一点?示例过滤器请求如下:
Select 所有具有(TAG A 和 TAG B)或(TAG C)的产品
TAG-A|TAG-B,TAG-C
我已经尝试过使用 EqualsAnyFilter
,但它的选择类似于 OR
,它过滤只有标签 A 的产品 - 但我希望它是一个 AND
过滤器。仅使用 EqualsFilter
似乎没有 returning 任何产品。
$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));
}
但这并不是return想要的结果。有没有办法像这样过滤产品?欢迎提出任何建议。谢谢!
我可以通过使用 ContainsFilter
来计算如下:
foreach ($andTags as $andTag) {
$andFilters[] = new ContainsFilter('tagIds', $andTag);
}