当前我们正在开发一个Zend Framework 2和Doctrine 2的非常灵活和模块化的应用程序。在这个应用程序中有多个Doctrine实体,例如,假设模块Products
中的实体Product
。该模块Products
是产品管理的基础/默认模块。原则继承替换
我们希望能够为客户创建自定义Products
模块(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 = ?
我想t1
代表ProductX
和t0
为Product
但我想不出为什么列是正确的(t1
),但在where子句不是(t0
)。
我知道Doctrine提供了Single Table Inheritance来实现继承,但是因此必须有DiscriminatorColumn并且需要在base/default实体上定义DiscriminatorMap。这不适合我们,因为如果我们为客户添加一个新的自定义模块(而这不是我们想要的),我们需要更改基本/默认模块。
有没有人有解决这个问题的线索?谢谢!
我正在尝试相同的方法,但问题是抽象实体类(AbstractProduct)不能在DQL查询中使用。根据[手册](http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html)映射的超类不能查询。你如何编写适用于Product和XProduct的查询? – aimfeld