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

在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>

问题:

  1. 哪里操作有误?
  2. 管理组件中已存在该实体的扩展,是否可以直接复用?

问题排查与解决方案

错误原因分析

报错Mapping definition neither have entities nor collection核心原因是目标实体的关联字段未完成映射配置,结合代码来看具体可能的问题点:

  • 你给ProductListingCriteriaEvent的Criteria添加了properties和properties.group关联,但当前查询的实体(比如Product)的映射文件中,未正确定义properties关联,或关联的目标实体(如PropertyGroup)映射存在错误。
  • 自定义实体myfilter_property_group_option_tag与Product/PropertyGroup的关联关系,未通过Shopware的扩展系统完成注册,导致框架无法识别该关联字段。
  • 错误地在当前实体的查询上下文中添加了不存在的关联字段,比如当前查询的实体本身不包含properties关联。

修复步骤

  1. 核查实体映射配置

    • 打开Product实体的定义文件,确认properties关联已正确声明,包括关联类型(如OneToMany/ManyToMany)、目标实体名称等参数。
    • 检查properties.group对应的PropertyGroup实体,确认group关联的映射配置无误。
    • 确认自定义实体MyFilterPropertyGroupOptionTag的映射文件中,已正确配置与Product/PropertyGroup的关联关系。
  2. 通过扩展系统注册关联
    如果是插件扩展实体,需在插件的src/Resources/config.xml中声明实体关联,示例:

    <entity name="product">
        <association name="properties" target="myfilter_property_group_option_tag" />
    </entity>
    

    注意关联名称、目标实体名称必须与代码中的引用完全匹配。

  3. 调整Criteria关联添加逻辑
    添加关联前,先确认当前查询的实体支持该关联,可通过$event->getDefinition()获取实体定义,判断后再执行关联添加操作,避免无效操作。

关于管理组件扩展的复用

可以直接复用管理组件中已存在的实体扩展,但需注意:

  • 确保管理组件的扩展已完成实体关联和映射的注册,直接引用已有的配置即可,无需重复定义。
  • 若管理组件是插件形式,需在你的插件的composer.json或plugin.xml中声明依赖关系,保证加载顺序正确。
  • 复用过程中直接使用已注册的关联名称,减少重复代码。

内容的提问来源于stack exchange,提问作者Stacker1427

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:05:14