【发布时间】:2012-01-06 05:44:18
【问题描述】:
我已阅读 Doctrine 2 Inheritance Mapping with Association,但如果您需要 Animal 本身成为一个实体,例如创建选项列表。
在这种情况下,Pet 的鉴别器列位于 animal table 的物种列中。
所以类应该是这样的。
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
}
我发现了几个问题。
animal表没有owner的外键。所以$pets关联不起作用。Animal和Pet或多或少是同一件事。如果有人 更改Animal中的某些内容这些更改不会反映在 任何Pet子类。
第一个问题的一个可能解决方案是有一个名为pet 的额外表,但关联仍然存在问题,因为鉴别器列仍在animal 表中,并且复制了@ 中的列987654337@ 会破坏规范化。
【问题讨论】:
标签: php inheritance orm doctrine-orm concrete-inheritance