ПРИМЕЧАНИЕ: если то, что я хочу, невозможно, будет принят "непонятный" ответ
В документации 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 для отображения в DB, но вы можете понять, что я имею в виду