Doctrine 2关联继承与不同的类

时间:2012-03-27 16:31:07

标签: php inheritance doctrine doctrine-orm associations

我正在使用Doctrine 2和单表继承,我最顶层的实体层次结构是:

JS_File --> [one to many] --> JS_File_Version

然后我的子类实体层次结构是:

JS_Image (extends JS_File) --> [one to many] --> JS_Image_Version (extends JS_File_Version)

继承映射非常适用于JS_File和JS_Image,并且关联映射可以完美地用于JS_File - > JS_File_Version。但是,当谈到在JS_Image上映射“版本”关联时,我得到:

'Property "versions" in "JS_Image" was already declared, but it must be declared only once'

我理解为什么会这样,该关联是从JS_File继承的,我不能覆盖它,但是我如何实现我想要做的事情?基本上,通过继承,我如何告诉Doctrine使用不同的targetEntity进行子类关联。

2 个答案:

答案 0 :(得分:2)

您正在寻找的是JS_Image实体上的@MappedSuperclass注释。

我想我之前使用过它,但根据文档,它允许你“定义多个实体类共有的状态和映射信息”,它也可以 “出现在另外映射的继承层次结构的中间”

也许您可以使用它来告诉Doctrine将您的JS_Image实体视为子实体的实际“父”实体。现在没有时间对此进行测试,所以如果有帮助请告诉我。

答案 1 :(得分:1)

看起来我正在尝试做的事情是不可能的(将JS_File和JS_Image都作为具体实体)。我已经遵循了教条用户邮件列表中某人的建议:

  

我解决这个问题的方法是使用抽象基类,然后在子类上定义实际的映射。例如,您可以执行以下操作:

     

带有子类的JS_AbstractFile:JS_File和JS_Image   带有子类的JS_AbstractVersion:JS_FileVersion和JS_ImageVersion

     

AbstractFile和AbstractVersion可以定义属性(和getter / setter),但是不应该为该字段定义任何映射信息。然后在您的子类中重新定义属性以及映射信息(至少,这就是我使用注释后我是如何做到的)

http://groups.google.com/group/doctrine-user/msg/243f355191d3a512