I have problems associating an entity with another using a OneToOne Association, where one entity is an instance of a Single-Table-Inheritance subclass.
I have one superclass, let's call it Animal, and some subclasses, e.g. Cat, Dog.
The animal contains an object_id
column which points to the ID of the owner and a discriminator column type
which points to the subclass (cat or dog).
I also have different entities which have one-to-one associations with one of the subclasses.
- CatLady 1 <-> 1 Cat (OK, bad example.. A Cat lady should own more than just one cat)
- DogOwner 1 <-> 1 Dog
Code:
/**
* 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;
}
Problem:
Before updating Doctrine from 2.3 to 2.4.5 it worked, but after I always got a Primary Key Value is Missing Exception
.
Now I am trying to figure out how to create this association between the CatLady and the Cat. The association may be unidirectional.
I guess the problem is, that the object_id
is not an primary key - which is not possible because it is not unique (only object_id and type would be unique, but the discriminator cannot be part of the primary key...).
Any solutions?
Update:
Maybe some more information will help:
As mentioned I am using Doctrine 2.4.5 and Symfony2.2. The last working version was with Doctrine 2.3 and Symfony2.1.
The column object_id
is neither a Primary Key nor a Foreign Key, because it is not unqiue and points to different classes/tables. This is maybe not the best database design, but I can't change it.
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 | |
+----------------+---------+------+-----+---------+----------------+
The tables for CatLady and DogOwner don't have a column pointing to Animal.