У меня проблемы с привязкой объекта к другому с помощью OneToOne Association, где один объект является экземпляром подкласса наследования одной таблицы.
У меня есть один суперкласс, давайте назовем его животное, и некоторые подклассы, например Котопес.
Животное содержит object_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
не является ни первичным ключом, ни внешним ключом, потому что он не является простым и указывает на разные классы / таблицы. Возможно, это не лучший дизайн базы данных, но я не могу его изменить.
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.
Задача ещё не решена.
Других решений пока нет …