在Subscriber中使用自定义实体关联字段遇映射定义错误求助
问题描述
尝试在Subscriber中使用自定义实体的关联字段时,遇到错误:
Mapping definition neither have entities nor collection.
相关代码如下:
Subscriber.php
class Subscriber implements EventSubscriberInterface { private EntityRepository $myfilter_property_group_option_tagRepository; public function __construct(EntityRepository $myfilter_property_group_option_tagRepository) { $this->myfilter_property_group_option_tagRepository = $myfilter_property_group_option_tagRepository; } public static function getSubscribedEvents(): array { return [ ProductListingCriteriaEvent::class => [ ['onListingCriteria', -200], ], ]; } public function onListingCriteria(ProductListingCriteriaEvent $event): void { $context = $event->getContext(); $optiontags = $this->myfilter_property_group_option_tagRepository->search(new Criteria(), $context); $event->getContext()->addExtension('optionTags', new ArrayEntity($optiontags)); // Further $event->getCriteria()->addAssociation('properties'); $event->getCriteria()->addAssociation('properties.group'); $criteria = $event->getCriteria(); $filters = $criteria->getExtension('filters'); if (!$filters instanceof FilterCollection) { return; } $propertyFilter = $filters->get('properties'); // More
services.xml
<service id="MyFilter\Subscriber\Subscriber"> <tag name="kernel.event_subscriber"/> <argument type="service" id="myfilter_property_group_option_tag.repository"/> </service>
问题:
- 哪里操作有误?
- 管理组件中已存在该实体的扩展,是否可以直接复用?
问题排查与解决方案
错误原因分析
报错Mapping definition neither have entities nor collection核心原因是目标实体的关联字段未完成映射配置,结合代码来看具体可能的问题点:
- 你给
ProductListingCriteriaEvent的Criteria添加了properties和properties.group关联,但当前查询的实体(比如Product)的映射文件中,未正确定义properties关联,或关联的目标实体(如PropertyGroup)映射存在错误。 - 自定义实体
myfilter_property_group_option_tag与Product/PropertyGroup的关联关系,未通过Shopware的扩展系统完成注册,导致框架无法识别该关联字段。 - 错误地在当前实体的查询上下文中添加了不存在的关联字段,比如当前查询的实体本身不包含
properties关联。
修复步骤
核查实体映射配置
- 打开Product实体的定义文件,确认
properties关联已正确声明,包括关联类型(如OneToMany/ManyToMany)、目标实体名称等参数。 - 检查
properties.group对应的PropertyGroup实体,确认group关联的映射配置无误。 - 确认自定义实体
MyFilterPropertyGroupOptionTag的映射文件中,已正确配置与Product/PropertyGroup的关联关系。
- 打开Product实体的定义文件,确认
通过扩展系统注册关联
如果是插件扩展实体,需在插件的src/Resources/config.xml中声明实体关联,示例:<entity name="product"> <association name="properties" target="myfilter_property_group_option_tag" /> </entity>注意关联名称、目标实体名称必须与代码中的引用完全匹配。
调整Criteria关联添加逻辑
添加关联前,先确认当前查询的实体支持该关联,可通过$event->getDefinition()获取实体定义,判断后再执行关联添加操作,避免无效操作。
关于管理组件扩展的复用
可以直接复用管理组件中已存在的实体扩展,但需注意:
- 确保管理组件的扩展已完成实体关联和映射的注册,直接引用已有的配置即可,无需重复定义。
- 若管理组件是插件形式,需在你的插件的
composer.json或plugin.xml中声明依赖关系,保证加载顺序正确。 - 复用过程中直接使用已注册的关联名称,减少重复代码。
内容的提问来源于stack exchange,提问作者Stacker1427
相关产品推荐
相关产品推荐

