Я прочитал Doctrine 2 Mapping с наследованием , но, если вам нужно, чтобы 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
и дублирует столбец в pet
нарушит нормализацию.
