Доктрина 2, как правильно отобразить многоуровневое наследование

У меня есть многоуровневая сущность доктрины наследования, подобная этой:

/**
* @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.

2

Решение

У меня такая же ситуация. Мне нужно более одного уровня наследования. Что в вашем случае ожидается поведение, вам нужно перечислить все сопоставленные классы в DiscriminatorMap,

В моем случае такой карты нет, потому что я использую собственное преобразование ClassName для ввода ключа, и это работает для классов на всех уровнях наследования.

abstract ClassA
abstract ClassB extends ClassA
- protected someName
ClassC extends ClassB

Когда я сохраняю ClassC у меня есть это свойство SomeName сохранены. Вы можете попробовать себя без дискриминационной карты и увидеть, что все классы сопоставлены и сохранены.

РЕДАКТИРОВАТЬ :

Еще одна вещь, если вы хотите избежать многоуровневого наследования, вы всегда можете использовать trait для этого. Просто сгруппируйте реквизит для черты и добавьте его к сущности. Есть хороший пример использования черты в DoctrineBehaviors расслоение. Там используют его для импорта дополнительных возможностей, таких как blamable, loggable и т.п.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]