首页 > 解决方案 > 产品活动的 EqualsFilter 不考虑继承

问题描述

我正在尝试从处于活动状态的存储库中获取产品。但是,某些变体从其父代继承了活动状态,这意味着它们在productDB 表中具有 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

解决方案


\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 问题以获取详细说明。


推荐阅读