我有一个关于教义映射策略的问题。
有两种不同的方法可以实现继承:映射超类或继承映射。我正在尝试做的是以下内容:
/**
* @ORMEntity
* @ORMInheritanceType("SINGLE_TABLE")
* @ORMDiscriminatorColumn(name="type", type="string")
* @ORMDiscriminatorMap({"B" = "B","C" = "C"})
* @ORMHasLifecycleCallbacks
*/
abstract class A {
OneToManyMappingToD
}
/**
* @ORMEntity
*/
class B {
}
/**
* @ORMEntity
*/
class C {
}
/**
* @ORMEntity
* @ORMInheritanceType("SINGLE_TABLE")
* @ORMDiscriminatorColumn(name="type", type="string")
* @ORMDiscriminatorMap({"E" = "E","F" = "F"})
* @ORMHasLifecycleCallbacks
*/
abstract class D {
ManyToOneToA
}
/**
* @ORMEntity
*/
class E {
}
/**
* @ORMEntity
*/
class F {
}
映射验证没有注意到任何问题,映射文件正常。但是当我以 -> submit() 的形式使用这些实体时,我必须等待大约 30 秒,Doctrine 执行了 8 000 多次调用。所以我认为我的映射有问题。
我不能使用任何 MappedSuperClasses,因为我绝对需要 oneToMany Relations。我认为问题是,A类和D类不是鉴别器映射的一部分,并且该学说无法正确映射关系。但是A和D并不是一个常规的实体,因为它们只是提供基本属性。
我怎样才能在不获得超过8 000个精选教义呼吁的情况下实现这一目标?
谢谢!
根据我的经验,使用类表继承适用于这种类型的关联。
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#class-table-inheritance
文档指出使用此策略会影响性能,但我不敢相信它会生成 8000 个 SELECT 查询。