У меня есть многоуровневая сущность доктрины наследования, подобная этой:
/**
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"customer" = "CustomerUser",
* "admin" = "AdminUser", "stock" = "StockUser"})
*/
abstract class User { ... }
/** @ORM\Entity */
abstract class EmployeeUser extends User { ... }
/** @ORM\Entity */
class AdminUser extends EmployeeUser { ... }
/** @ORM\Entity */
class StockUser extends EmployeeUser { ... }
Однако это не работает таким образом, поля EmployeeUser не считываются из базы данных и не сохраняются.
Я обнаружил, что это работает, когда я задаю карту дискриминатора следующим образом:
* @ORM\DiscriminatorMap({"customer" = "CustomerUser",
* "admin" = "AdminUser", "stock" = "StockUser", "EmployeeUser"})
он начинает работать таким образом (нет необходимости указывать ключ дискриминатора для EmployeeUser — так как он абстрактный и никогда не будет создан), но
Мне не нравится, когда случается магия, я не понимаю достаточно 🙂 поэтому мой вопрос: это правильное решение? Чтобы просто сообщить Doctrine таким образом, что этот класс каким-то образом включен в иерархию наследования? Или это должно быть сделано как-нибудь еще?
Я не нашел упоминаний о том, как сделать наследование классов сущностей многоуровневым в документах Doctrine.
У меня такая же ситуация. Мне нужно более одного уровня наследования. Что в вашем случае ожидается поведение, вам нужно перечислить все сопоставленные классы в DiscriminatorMap
,
В моем случае такой карты нет, потому что я использую собственное преобразование ClassName для ввода ключа, и это работает для классов на всех уровнях наследования.
abstract ClassA
abstract ClassB extends ClassA
- protected someName
ClassC extends ClassB
Когда я сохраняю ClassC у меня есть это свойство SomeName сохранены. Вы можете попробовать себя без дискриминационной карты и увидеть, что все классы сопоставлены и сохранены.
РЕДАКТИРОВАТЬ :
Еще одна вещь, если вы хотите избежать многоуровневого наследования, вы всегда можете использовать trait
для этого. Просто сгруппируйте реквизит для черты и добавьте его к сущности. Есть хороший пример использования черты в DoctrineBehaviors расслоение. Там используют его для импорта дополнительных возможностей, таких как blamable
, loggable
и т.п.
Других решений пока нет …