Doctrine继承 - 从Joined表继承的Single_Table

时间:2014-04-01 14:49:27

标签: php symfony inheritance doctrine-orm

这是我想要的配置:

一个实体“帐户”,其中包含对两个其他实体的JOINED继承:“作者”和“AccountBackend”。

然后我希望“AccountBackend”与其他两个实体具有SINGLE_TABLE继承:“Administrator”和“FeaturedAuthor”。这就是我定义它们的方式:

Account.php

/** 
 * @Entity (repositoryClass="Repositories\Account") 
 * @Table(name="accounts")  
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="integer")
 * @DiscriminatorMap({"1"="Author","2"="AccountBackend"})
 * @HasLifecycleCallbacks
 */
class Account
{

Curator.php

/**
 * @Entity
 * @Table(name="accounts_author")
 */
class Author extends Account
{

AccountBackend.php

/** 
 * @Entity (repositoryClass="Repositories\AccountBackend") 
 * @Table(name="accounts_backend")  
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="integer")
 * @DiscriminatorMap({"1"="FeaturedAuthor","2"="Administrator"})
 * @HasLifecycleCallbacks
 */
class AccountBackend extends Account
{

FeaturedAuthor.php

/**
 * @Entity
 */
class FeaturedAuthor extends AccountBackend
{

Administrator.php

/**
 * @Entity
 */
class Administrator extends AccountBackend
{

当我定义它们时,当我尝试通过CLI进行更新时,它说

  

“实体'实体\ AccountBackend'必须是鉴别器的一部分   “实体\帐户”的映射要在继承中正确映射   层次结构。或者,您可以将'Entities \ AccountBackend'设为一个   抽象类,以避免发生此异常。“

我没有看到我定义它们的方式有任何问题,这是我第一次尝试在已经继承的Entity上继承。什么意思错了?谢谢!

2 个答案:

答案 0 :(得分:7)

您的" AccountBackend"需要一个案例。 @DiscriminatorMap中的类

例如

@DiscriminatorMap({"1"="FeaturedAuthor","2"="Administrator", "3"="AccountBackend"})

Documentation

中解释
  

应该在@DiscriminatorMap中指定属于映射实体层次结构(包括最顶层类)的所有实体类。在上面包括Person类的情况下。

答案 1 :(得分:4)

如果你来到这里& SINGLE_TABLE 继承有问题 - 因为你的鉴别器类不是抽象的,所以可能会出现问题。

我的案例(解决方案)

/**
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="entity", type="string")
 * @ORM\DiscriminatorMap({"product" = "ProductReview", "seller" = "SellerReview"})
 * @ORM\Table(name="reviews")
 */
abstract class Review {}

class ProductReview extends Review {}

class SellerReview extends Review {}