shopware - 产品活动的 EqualsFilter 不考虑继承
问题描述
我正在尝试从处于活动状态的存储库中获取产品。但是,某些变体从其父代继承了活动状态,这意味着它们在product
DB 表中具有 active = NULL。
EqualsFilter 将导致以下查询,而不是获取继承活动状态的变体:
SELECT `product`.`id` FROM `product` WHERE (`product`.`version_id` = :version) AND `product`.`active` = true
过滤活性产品的正确方法是什么?这是我当前的代码:
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('active', true));
$this->productRepository->search($criteria, Context::createDefaultContext());
这可行,但似乎是一个需要完成大量工作的错误。
$criteria->addFilter(
new MultiFilter(
MultiFilter::CONNECTION_OR,
[
new EqualsFilter('active', true),
new MultiFilter(
MultiFilter::CONNECTION_AND,
[
new EqualsFilter('active', null),
new EqualsFilter('parent.active', true)
]
)
]
)
);
将导致此查询:
SELECT `product`.`id` FROM `product` LEFT JOIN `product` `product.parent` ON `product`.`parent_id` = `product.parent`.`id` AND `product`.`version_id` = `product.parent`.`version_id` WHERE (`product`.`version_id` = :version) AND (`product`.`active` = true OR (`product`.`active` IS NULL AND `product.parent`.`active` = true))
更新
因此,如果提供一个 SalesChannelContext 而不是默认上下文,它似乎可以工作并且查询等于最后一个。造成这种情况的原因是什么?当您没有销售渠道上下文时,是否有解决方法?
解决方案
有\Shopware\Core\Framework\Context
一个considerInheritance
- 标志。此标志完全控制您描述的行为。
默认情况下,此标志设置为false
。这是因为在使用 admin-api 时,您无法知道特定属性值是直接来自手头的产品还是它的父级。此机制主要用于始终获取父产品的管理,以区分继承和非继承属性。
在店面加载产品时,considerInheritance
-flag 始终是 to true
,因为我们不想额外获取父产品。
如果你想改变这种行为,你可以使用setConsiderInheritance()
Context 的方法。您的示例代码将如下所示:
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('active', true));
$context = Context::createDefaultContext();
$context->setConsiderInheritance(true);
$this->productRepository->search($criteria, $context);
请记住,通常您应该尽量不使用createDefaultContext()
- 方法,请参阅此GitHub 问题以获取详细说明。
推荐阅读
- google-apps-script - 如何访问通过 HtmlService 模板发送的对象数组?
- java - 如何检查所有 JSON 值是否都是字符串类型
- javascript - 通过在地址栏中输入 URL 进行重定向
- elasticsearch - 查询生成器未在 Elastic Search JAVA 高级重置客户端中找到匹配项
- html - 在html中单击jsp的按钮
- gitlab - 是否可以在 gitlab 上创建分支类型?
- json - JSON 到 C# 对象失败
- reactjs - 类型参数不可分配给 BaseUI 类型的参数
- html - 对所有可调整大小的子元素强制使用 flex 容器的最大宽度
- javascript - Google 表格脚本:TypeError:无法读取未定义的属性“changeType”