Doctrine继承替换

Tom*_*sen 6 inheritance doctrine-orm zend-framework2

目前我们正在使用Zend Framework 2和Doctrine 2开发一个非常灵活和模块化的应用程序.在这个应用程序中有多个Doctrine实体,例如让我们说Product模块中的实体Products.该模块Products是产品管理的基础/默认模块.

我们希望能够Products为customer(XProducts)创建自定义模块.因此,我创建了一个新实体XProduct(带有一些额外的字段),并扩展了它Product.

因此,如果自定义模块已启用,我想使用XProduct和其他Product,但从不在一起(在同一个项目中).

如果我使用@Entity注释两个实体,它会部分工作; 例如,findAll工作完美,但find不起作用:创建的SELECT语句包含正确的列,但WHERE子句是错误的.例如:

SELECT t1.id AS id2, t1.name AS name3 FROM products t1 WHERE t0.id = ?
Run Code Online (Sandbox Code Playgroud)

我猜是t1代表ProductXt0为,Product但我无法弄清楚为什么列是正确的(t1)但是where子句不是(t0).

我知道Doctrine提供了单表继承来实现继承,但是因此必须有一个DiscriminatorColumn并在base/default实体上定义DiscriminatorMap.这不适合我们,因为如果我们为客户添加一个新的自定义模块(这不是我们想要的......),我们需要更改我们的基本/默认模块.

有没有人有解决这个问题的线索?谢谢!

Tom*_*sen 7

我终于解决了这个问题.对于所有默认/基类,我创建了一个额外的抽象MappedSuperclass(正如Jurian Sluiman所提到的).例如,对于Product客户的特定实体,我需要以下内容:

  • AbstractProduct(包含所有默认/基本功能)
  • 产品(默认/基类为空并扩展AbstractProduct)
  • XProduct(包含我们客户的额外功能并扩展AbstractProduct)

要修复MappedSuperclass上的关联问题,我引用抽象类,例如: @ORM\OneToOne(targetEntity="ProductManagement\Entity\AbstractProduct")

然后我使用Doctrine的EntityResolver(参见http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/resolve-target-entity-listener.html)来映射抽象类(或接口)与真实实体的关联(取决于配置):

'entity_resolver' => array(
    'orm_default' => array(
        'resolvers' => array(
            // Note: Use only one
            'ProductManagement\Entity\AbstractProduct' => 'ProductManagement\Entity\Product', // Default
            'ProductManagement\Entity\AbstractProduct' => 'XProductManagement\Entity\XProduct', // For customer X
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以使用特定实体覆盖我的客户实体,而无需更改默认/基本模块和实体(这正是我所寻找的).