Использование дискриминатора в сущности, которая расширяет другую

Я пытаюсь использовать Discriminator в сущности, которая простирается от другой. Это код, который я сделал:

 /** * @ORM\Entity * @ORM\Table(name="usuarios_externos.usuarios", schema="usuarios_externos") * @ORM\InheritanceType("JOINED") * @ORM\DiscriminatorColumn(name="discr", type="string") * @ORM\DiscriminatorMap({ * "natural" = "Natural", * "empresa" = "Empresa" * }) * @UniqueEntity(fields={"correo_alternativo"}, message="El correo electrónico ya está siendo usado.") * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false) */ class Usuario extends BaseUser { .... } 

Но я получаю эту ошибку при запуске команды doctrine:schema:validate :

[Doctrine \ ORM \ Mapping \ MappingException] Сущность «UsuarioBundle \ Entity \ Usuario» должна быть частью карты дискриминатора «UsuarioBundle \ Entity \ Usuario», которая должна быть правильно отображена в иерархии наследования. В качестве альтернативы вы можете сделать «UsuarioBundle \ Entity \ Usuario» абстрактным классом, чтобы избежать этого исключения.

Любой способ исправить это? Можно использовать Disccriminator в расширенных классах?

Ответ прямо в warning сообщении!

В основном, это говорит вам, что Usuario определен таким образом, который может привести к неприятностям. В его текущей форме этот код позволяет вам создать экземпляр Usuario и работать с ним. Но подождите секунду. Это не определено на карте дискриминатора. Итак, что произойдет, когда вы попытаетесь его сохранить? Boom! … или, по крайней мере, это вызовет уродливое исключение.

Теперь я знаю, что вы, вероятно, даже не думали о создании Usuario . Это просто базовый класс для Natural и Empresa , но Doctrine этого не знает .

Итак, как вы можете это исправить? В зависимости от ваших потребностей возможны два сценария:

Usuario должен быть реалистичным

То есть пользователи в вашем приложении могут быть экземпляром Natural , Empresa или просто Usuario . Вероятно, это не так, но это может относиться к будущему читателю.

Решение: добавьте Usuario к карте дискриминатора. Это позволит вашим пользователям быть одним из трех типов.

  * ... * @ORM\DiscriminatorMap({ * "usuario" = "Usuario", * "natural" = "Natural", * "empresa" = "Empresa" * }) * ... 

Usuario не должен быть реалистичным

То есть пользователи в вашем приложении могут быть либо экземпляром Natural либо Empresa , но никогда не Usuario .

Решение: сделайте Usuario abstract классом. Это сделает невозможным создание экземпляра.

 abstract class Usuario extends BaseUser { ...