如何为MyProductEntity的connectedProduct加载价格信息?
问题描述
我自定义了MyProductEntity实体(已创建对应的Definition与Collection),该实体与Product存在关联关系(一个商品可关联另一个商品)。当前遇到的问题是MyProductEntity->connectedProduct不包含价格信息(比如calculatedPrices)。我看到资料说应该用SalesChannelProductEntity替代ProductEntity,但不知道具体操作方法,求相关提示。
相关代码片段
MyProductEntity 类
class MyProductEntity extends Entity { protected string $productId; protected string $productVersionId; protected ProductEntity $product; protected string $connectedProductId; protected string $connectedProductVersionId; protected ProductEntity $connectedProduct; //我试过在这里用 "SalesChannelProductEntity" 替换 "ProductEntity" //... //其他属性 }
订阅者中的加载逻辑
public function getMyProducts(ProductPageLoadedEvent $event): array { $page = $event->getPage(); $salesChannelContext = $event->getSalesChannelContext(); $product = $page->getProduct(); $criteria = new Criteria(); $criteria->addFilter(new EqualsFilter('productId', $product->getId())); $criteria->addAssociation('connectedProduct'); $myProducts = $this->myProductRepository->search($criteria, $salesChannelContext); //$this->myProductRepository 通过 services.xml 定义 / 构造函数注入: // EntityRepository $myProductRepository }
解决方法
- 同步修改实体类与Definition的关联配置:
- 先把
MyProductEntity中connectedProduct的类型改为SalesChannelProductEntity:protected SalesChannelProductEntity $connectedProduct; - 关键步骤:在
MyProductDefinition的defineFields方法中,将connectedProduct的关联目标从ProductDefinition替换为SalesChannelProductDefinition,同时调整关联字段的配置:protected function defineFields(): FieldCollection { return new FieldCollection([ // ...其他已有的字段配置 // 关联ID字段 (new ManyToOneField('connected_product_id', 'connectedProductId', SalesChannelProductDefinition::class)) ->addFlags(new PrimaryKey(), new Required()), // 版本号字段 (new ReferenceVersionField(SalesChannelProductDefinition::class)) ->setPropertyName('connectedProductVersionId'), // 关联实体字段 (new AssociationField('connectedProduct', 'connected_product_id', SalesChannelProductDefinition::class, 'id', false)) ]); }
- 先把
- 完善查询时的关联加载:
在构建查询Criteria时,不仅要关联connectedProduct,还需要明确加载价格相关的嵌套关联,确保价格数据被正确获取:$criteria->addAssociation('connectedProduct.calculatedPrices'); $criteria->addAssociation('connectedProduct.price'); // 如果需要原始价格数据 - 确保SalesChannelContext正确传递:
你已经在查询时传入了SalesChannelContext,这一步是正确的——SalesChannelProductEntity的价格计算依赖该上下文(包含销售渠道、客户组、货币等信息),Shopware会自动基于上下文计算出对应的calculatedPrices。 - 验证仓库注入:
确认myProductRepository是正确注入的EntityRepository实例,确保它能正确处理SalesChannelProductEntity的关联查询。
内容的提问来源于stack exchange,提问作者MilMike
相关产品推荐
相关产品推荐

