EqualsFilter for product active 不考虑继承
EqualsFilter for product active does not account for inheritance
我正在尝试从存储库中获取活动的产品。但是,一些变体从其父级继承活动状态,这意味着它们在 product
DB table.
中具有 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
标志始终是 true
,因为我们不想另外获取父产品。
如果您想更改该行为,您可以使用 Context 的 setConsiderInheritance()
方法。
您的示例代码将如下所示:
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('active', true));
$context = Context::createDefaultContext();
$context->setConsiderInheritance(true);
$this->productRepository->search($criteria, $context);
请记住,一般情况下您应该尽量不要使用createDefaultContext()
-方法,请参阅此GitHub issue以获得详细说明。
我正在尝试从存储库中获取活动的产品。但是,一些变体从其父级继承活动状态,这意味着它们在 product
DB table.
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
标志始终是 true
,因为我们不想另外获取父产品。
如果您想更改该行为,您可以使用 Context 的 setConsiderInheritance()
方法。
您的示例代码将如下所示:
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('active', true));
$context = Context::createDefaultContext();
$context->setConsiderInheritance(true);
$this->productRepository->search($criteria, $context);
请记住,一般情况下您应该尽量不要使用createDefaultContext()
-方法,请参阅此GitHub issue以获得详细说明。