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.这只是一个基类Natural和Empresa,但教义并不知道.
那么,你怎么解决它?根据您的需要,有两种可能的情况:
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)