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


Using discriminator in a entity that extends another

我正试图在从另一个实体扩展的实体中使用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。它只是NaturalEmpresa的基类,但条令并不知道这一点

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

Usuario应该是可实例化的

也就是说,应用程序中的用户可以是NaturalEmpresa的实例,也可以只是普通的Usuario。事实可能并非如此,但它可能适用于未来的读者。

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

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

Usuario应该而不是是可实例化的

也就是说,应用程序中的用户可以是NaturalEmpresa的实例,但不能是Usuario

解决方案:使Usuario成为abstract类。这将使它不可能被实例化。

abstract class Usuario extends BaseUser {
    ...