与学说中的STI继承有关

时间:2014-09-29 08:20:21

标签: php symfony doctrine-orm sti

我在使用OneToOne关联将实体与另一个实体关联时遇到问题,其中一个实体是Single-Table-Inheritance子类的实例。

我有一个超类,我们称之为动物,以及一些子类,例如: 猫,狗。 动物包含object_id ,其指向所有者的ID,鉴别列 type指向子类(猫或狗) )。

我也有不同的实体,这些实体与其中一个子类具有一对一的关联。

  • CatLady 1< - > 1 Cat (好的,不好的例子......猫女士应该只拥有一只猫)
  • DogOwner 1< - > 1

代码:

/**
 * 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的列。

0 个答案:

没有答案