You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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的关联配置:
    1. 先把MyProductEntity中connectedProduct的类型改为SalesChannelProductEntity:
      protected SalesChannelProductEntity $connectedProduct;
      
    2. 关键步骤:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:15:41