ПРИМЕЧАНИЕ: если то, что я хочу, невозможно, будет принят ответ "невозможно"
В документации Doctrine 2 о отображении наследования там сказано, что есть 2 способа:
- Наследование одной таблицы (STI)
- Наследование таблицы классов (CTI)
Для обоих есть предупреждение:
Если вы используете сущность STI/CTI как сущность «многие к одному» или «один к одному», вы никогда не должны использовать один из классов на верхних уровнях иерархии наследования в качестве «targetEntity», только те, у которых нет подклассов. В противном случае Doctrine НЕ МОЖЕТ создавать прокси-экземпляры этой сущности и ВСЕГДА будет жадно загружать сущность.
Итак, как мне приступить к использованию наследования с привязкой к базовому (абстрактному) классу? (и сохранить производительность, конечно)
Пример
У пользователя много Pet
(абстрактный класс, расширенный Dog
или Cat
).
Что я хочу сделать :
class User {
/**
* @var array(Pet) (array of Dog or Cat)
*/
private $pets;
}
Из-за предупреждения в документации Doctrine я должен сделать это:
class User {
/**
* @var array(Dog)
*/
private $dogs;
/**
* @var array(Cat)
*/
private $cats;
}
Это раздражает, потому что я теряю преимущества наследования!
Примечание. Я не добавлял аннотации Doctrine для сопоставления с БД, но вы понимаете, что я имею в виду
instanceof
... Много странных вещей для такой простой вещи. Буду иметь в виду, если решения не будет. - person Matthieu Napoli   schedule 26.04.2011