我在使用OneToOne关联将实体与另一个实体关联时遇到问题,其中一个实体是Single-Table-Inheritance子类的实例。
我有一个超类,我们称之为动物,以及一些子类,例如: 猫,狗。
动物包含object_id
列,其指向所有者的ID,鉴别列 type
指向子类(猫或狗) )。
我也有不同的实体,这些实体与其中一个子类具有一对一的关联。
代码:
/**
* Animal
*
* @ORM\Table("animal")
* @ORM\Entity()
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="integer")
* @ORM\DiscriminatorMap({0 = "Cat", 1 = "Dog"})
*/
abstract class Animal {
/**
* @var integer
* @ORM\Id()
* @ORM\Column(name="id", type="integer")
*/
protected $id;
/**
* @var integer
*
* @ORM\Column(name="object_id", type="integer")
*/
protected $object_id;
}
/**
* Cat
*
* @ORM\Entity()
*/
class Cat extends Animal {}
/**
* CatLady
* @ORM\Entity()
*/
class CatLady {
/**
* @var Cat
*
* @ORM\OneToOne(targetEntity="\Path\To\Entity\Cat")
* @ORM\JoinColumn(name="id", referencedColumnName="object_id", nullable=true))
*/
private $cat;
}
问题:
在将Doctrine从2.3更新到2.4.5之前,它有效,但在我总是得到Primary Key Value is Missing Exception
之后。
现在我想弄清楚如何在CatLady和Cat之间创建这种关联。关联可能是单向的。
我想问题是,object_id
不是主键 - 这是不可能的,因为它不是唯一的(只有object_id和type才是唯一的,但是鉴别器不能成为主键的一部分......)。
任何解决方案?
更新
也许更多信息会有所帮助:
如上所述,我使用的是Doctrine 2.4.5和Symfony2.2。最后一个工作版本是Doctrine 2.3和Symfony2.1。
列object_id
既不是主键也不是外键,因为它不是unqiue并且指向不同的类/表。这可能不是最好的数据库设计,但我无法改变它。
Table: Animal
+----------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| object_id | int(11) | NO | MUL | NULL | |
| object_type | int(11) | NO | | NULL | |
+----------------+---------+------+-----+---------+----------------+
CatLady和DogOwner的表格没有指向Animal的列。