在扩展另一个实体中使用鉴别器
Posted
技术标签:
【中文标题】在扩展另一个实体中使用鉴别器【英文标题】:Using discriminator in a entity that extends another 【发布时间】:2014-11-20 20:36:27 【问题描述】:我正在尝试在从另一个扩展的实体中使用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' 一个抽象类来避免这种情况 发生异常。
有什么办法可以解决这个问题吗?可以在扩展类中使用鉴别器吗?
【问题讨论】:
【参考方案1】:答案就在warning
消息中!
基本上,它告诉您Usuario
的定义方式可能会导致麻烦。在其当前形式中,此代码允许您创建 Usuario
的实例并使用它。但请稍等。这在鉴别器图中没有定义。那么,当你试图坚持它时会发生什么? 轰隆隆!...或者至少它会抛出一个丑陋的异常。
现在,我知道您可能甚至没有考虑过实例化 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
...
【讨论】:
很好的答案。救了我。谢谢!以上是关于在扩展另一个实体中使用鉴别器的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2:字段或鉴别器列映射中实体上列“id”的重复定义