我有一个基类/实体,它由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'
根据不同的地方,这与缺乏鉴别图有关。但是,如果没有单个鉴别器列,如何添加鉴别器映射。这是一个遗留改造,所以我可以添加一个列,但我想知道是否有一种方法可以正确映射这些列。
答案 0 :(得分:0)
如果使用Doctrine Single Table Inheritance,则必须在Base
类上添加discriminator列。来自documentation:
必须上指定@InheritanceType和@DiscriminatorColumn 最顶层的类,它是映射的实体层次结构的一部分。
您可以做的是将Base
类定义为Mapped Superclass,并使SubClass1
和SubClass2
扩展它。但是,由于它们映射到数据库中的同一个表,因此必须为子类使用两个不同的实体管理器。例如,如果您将SubClass1
放在src/Entity/Dir1
和SubClass2
放入src/Entity/Dir2
,config.yml
:
doctrine:
orm:
default_entity_manager: manager1
...
entity_managers:
manager1:
mappings:
AppBundle:
dir: Entity/Dir1
manager2:
mappings:
AppBundle:
dir: Entity/Dir2
这样您就不必在数据库中添加列,但是您必须在代码中的任何位置指定您使用的管理器。