php – Doctrine 2具有关联的具体表继承
我已经阅读了
Doctrine 2 Inheritance Mapping with Association,但是如果你需要Animal本身就是一个实体,比如创建选项列表.
在这种情况下,Pet的Discriminator Column位于动物表的种类列中. 所以这些类就是这样的. class Animal { $id; $species; } /** * @Table(name="animal") * @InheritanceType("JOINED") * @DiscriminatorColumn(name="species",type="string") * @DiscriminatorMap({"dog" = "Dog","cat" = "Cat"}) */ abstract class Pet { $id $species; } class Dog extends Pet { } class Cat extends Pet { } class Owner { /** * @OneToMany(targetEntity="Pet") */ $pets } 我看到了几个问题. >动物表没有所有者的外键.所以 对第一个问题的一个可能的解决方案是有一个名为pet的额外表,但是关联仍然存在问题,因为鉴别器列仍在动物表中并且重复宠物中的列会破坏规范化. 解决方法
我不确定完全理解你的问题,但我会试一试:
> Pet是一个动物,在你的类层次结构中明确它是有意义的.请注意,抽象类Pet可以子类化具体类Animal.这样,您仍然可以实例化动物,狗或猫,但您无法实例化宠物; 最后说明,你真的需要一个Pet课吗?如果一个宠物没有任何特定的动物(即该类是空的),那么你应该从你的类层次结构中删除它. class Owner { /** * @OneToMany(targetEntity="Animal") */ protected $animals; } /** * @Table(name="animal") * @InheritanceType("JOINED") * @DiscriminatorColumn(name="species",type="string") * @DiscriminatorMap({"animal" = "Animal","dog" = "Dog","cat" = "Cat"}) */ class Animal { /** @Id @Column(type="integer") @GeneratedValue */ protected $id; /** @ManyToOne(targetEntity="Owner") */ protected $owner; } abstract class Pet extends Animal { // Do you really need this class? } class Dog extends Pet { // ... } class Cat extends Pet { // ... } 关于您的数据库结构,我建议进行以下更改: >从Dog&移动owner_id猫到动物桌;>从Dog&中删除animal_id猫表;他们将与Animal表(一对一)共享id值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |