我正试图在从另一个实体扩展的实体中使用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
:时遇到了这个错误
[条令''ORM''映射''映射异常]实体"UsuarioBundle''Entity''Usuario"必须是鉴别器映射的一部分"UsuarioBundle''Entity''Usuario"的继承层次结构。或者,您可以制作"UsuarioBundle''Entity''Usuario"是一个抽象类来避免这种情况发生异常。
有办法解决这个问题吗?是否可以在扩展类中使用鉴别器?
答案就在warning
消息中!
基本上,它告诉你Usuario
的定义方式可能会导致麻烦。在当前形式中,此代码允许您创建Usuario
的实例并使用它。但请稍等。这在鉴别器映射中没有定义。那么,当你努力坚持下去的时候会发生什么呢轰。。。或者至少它会抛出一个丑陋的异常。
现在,我知道你可能甚至没有想过实例化Usuario
。它只是Natural
和Empresa
的基类,但条令并不知道这一点。
那么,你该怎么解决呢?根据您的需求,有两种可能的情况:
Usuario
应该是可实例化的
也就是说,应用程序中的用户可以是Natural
、Empresa
的实例,也可以只是普通的Usuario
。事实可能并非如此,但它可能适用于未来的读者。
解决方案:将Usuario
添加到鉴别器映射中。这将使您的用户可以成为这三种类型中的任何一种。
* ...
* @ORM'DiscriminatorMap({
* "usuario" = "Usuario",
* "natural" = "Natural",
* "empresa" = "Empresa"
* })
* ...
Usuario
应该而不是是可实例化的
也就是说,应用程序中的用户可以是Natural
或Empresa
的实例,但不能是Usuario
。
解决方案:使Usuario
成为abstract
类。这将使它不可能被实例化。
abstract class Usuario extends BaseUser {
...