在扩展另一个实体的实体中使用鉴别器

Rey*_*rPM 13 php mapping orm symfony doctrine-orm

我试图Discriminator在一个从另一个扩展的实体中使用a .这是我制作的代码:

/**
 * @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 {
    ....
}
Run Code Online (Sandbox Code Playgroud)

但是在运行命令时我收到此错误doctrine:schema:validate:

[Doctrine\ORM\Mapping\MappingException]实体'UsuarioBundle\Entity\Usuario'必须是'UsuarioBundle\Entity\Usuario'的鉴别器映射的一部分才能在继承层次结构中正确映射.或者,您可以将"UsuarioBundle\Entity\Usuario"设为抽象类,以避免发生此异常.

有任何解决这个问题的方法吗?可以在扩展类中使用Discriminator吗?

Fyo*_*orX 32

答案就在warning消息中!

基本上,它告诉你这Usuario是以一种可能导致麻烦的方式定义的.在当前形式中,此代码允许您创建实例Usuario并使用它.但等一下.这在鉴别器图中没有定义.那么,当你试图坚持下去时会发生什么?繁荣!......或者至少它会抛出一个丑陋的例外.

现在,我知道你可能甚至没有想过实例化Usuario.这只是一个基类NaturalEmpresa,但教义并不知道.

那么,你怎么解决它?根据您的需要,有两种可能的情况:

Usuario 应该是可实例化的

也就是说,在您的应用程序的用户可以是一个实例Natural,Empresa或只是简单Usuario.情况可能并非如此,但它可能适用于未来的读者.

解决方案:添加Usuario到鉴别器映射.这将使您的用户成为这三种类型中的任何一种.

 * ...
 * @ORM\DiscriminatorMap({
 *     "usuario" = "Usuario",
 *     "natural" = "Natural",
 *     "empresa" = "Empresa"
 * })
 * ...
Run Code Online (Sandbox Code Playgroud)

Usuario应该不会是实例化

也就是说,应用程序中的用户可以是Natural或的实例Empresa,但从不Usuario.

解决方法:Usuario一个abstract类.这将使其无法实例化.

abstract class Usuario extends BaseUser {
    ...
Run Code Online (Sandbox Code Playgroud)