Doctrine单表继承没有鉴别器映射

时间:2017-07-06 15:27:11

标签: php mysql doctrine-orm doctrine

我有一个基类/实体,它由2个不同的实体扩展,每个实体使用相同的数据库表来存储特定的数据。

/**
 * @ORM\Table(name="my_table")
 * @ORM\Entity()
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\HasLifecycleCallbacks()
 */
abstract class Base {

}

/**
 * Subclass1
 * @ORM\Entity()
 */
class Subclass1 extends Base {

    /**
     * @var propertyForSubClass1
     */
    private $propertyForSubClass1;
}

/**
 * Subclass2
 * @ORM\Entity()
 */
class Subclass2 extends Base {

    /**
     * @var propertyForSubClass2
     */
    private $propertyForSubClass2;
}

SubClass1使用了许多常用列,以及特定于自身的列。 SubClass2执行相同的操作,它使用常用列以及SubClass1未使用的特定列。我在这种关系中遇到问题导致显示错误:

Column not found: 1054 Unknown column 't0.dtype' in 'field list'

根据不同的地方,这与缺乏鉴别图有关。但是,如果没有单个鉴别器列,如何添加鉴别器映射。这是一个遗留改造,所以我可以添加一个列,但我想知道是否有一种方法可以正确映射这些列。

1 个答案:

答案 0 :(得分:0)

如果使用Doctrine Single Table Inheritance,则必须在Base类上添加discriminator列。来自documentation

  

必须上指定@InheritanceType和@DiscriminatorColumn   最顶层的类,它是映射的实体层次结构的一部分。

您可以做的是将Base类定义为Mapped Superclass,并使SubClass1SubClass2扩展它。但是,由于它们映射到数据库中的同一个表,因此必须为子类使用两个不同的实体管理器。例如,如果您将SubClass1放在src/Entity/Dir1SubClass2放入src/Entity/Dir2config.yml

doctrine:
  orm:
    default_entity_manager: manager1
      ...
      entity_managers:
        manager1:
          mappings:
            AppBundle:  
              dir: Entity/Dir1
        manager2:
          mappings:
            AppBundle:  
              dir: Entity/Dir2

这样您就不必在数据库中添加列,但是您必须在代码中的任何位置指定您使用的管理器。