Shopware 6:加载DocumentEntity时关联Order版本错误问题咨询
Shopware 6 高效加载单据关联的正确订单版本
行为是否符合预期?
是,这是Shopware 6版本系统的预期设计:默认关联加载订单时,会自动使用LIVE版本(固定ID:0fa91ce3e96a4bc2be4bd9ce752c3425),确保获取订单的最新状态。但单据(发票、贷项通知单等)创建时会关联订单的特定快照版本,因此直接关联加载会拿到错误的版本。
高效解决方法(避免N+1查询)
无需逐个加载订单,只需在关联订单时通过关联过滤器,让Shopware自动匹配单据的orderVersionId与订单的versionId,一次查询即可拉取所有对应版本的订单及关联数据。
修改后的Criteria代码示例:
$criteria = new Criteria(); // 原有的时间范围过滤 $criteria->addFilter(new RangeFilter('config.documentDate', [ RangeFilter::GTE => $from->format('Y-m-d'), RangeFilter::LTE => $till->format('Y-m-d') ])); // 销售渠道过滤(如果有) if ($salesChannelIds) { $criteria->addFilter(new EqualsAnyFilter('salesChannelId', $salesChannelIds)); } // 配置订单关联,指定版本匹配逻辑 $criteria->addAssociation('order', function (Criteria $orderCriteria) { // 引用父实体(Document)的orderVersionId字段,匹配订单的versionId $orderCriteria->addFilter(new EqualsFilter('versionId', ':orderVersionId')); }); // 添加订单的子关联(直接用点语法即可) $criteria->addAssociation('order.lineItems'); $criteria->addAssociation('order.transactions'); $criteria->addAssociation('order.deliveries'); $criteria->addAssociation('order.deliveries.shippingOrderAddress.country'); $criteria->addAssociation('order.salesChannel'); $criteria->addAssociation('order.billingAddress'); $criteria->addAssociation('order.billingAddress.country'); // 其他关联 $criteria->addAssociation('documentType'); $documents = $this->documentRepository->search($criteria, $context)->getEntities();
原理说明
通过闭包给order关联添加过滤器时,:orderVersionId会被Shopware自动替换为当前Document实体的orderVersionId值,最终生成的SQL会将document表的order_version_id与order表的version_id进行JOIN匹配,一次性拉取所有对应版本的订单数据,彻底避免N+1查询问题。
内容的提问来源于stack exchange,提问作者Stahlkocher
相关产品推荐
相关产品推荐

