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以获得详细说明。