我对Doctrine的制图策略有疑问。
实现继承有两种不同的方法:MappedSuperclass或Inheritance Mapping。我想要做的是以下几点:
/**
* @ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"B" = "B","C" = "C"})
* @ORM\HasLifecycleCallbacks
*/
abstract class A {
OneToManyMappingToD
}
/**
* @ORM\Entity
*/
class B {
}
/**
* @ORM\Entity
*/
class C {
}
/**
* @ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"E" = "E","F" = "F"})
* @ORM\HasLifecycleCallbacks
*/
abstract class D {
ManyToOneToA
}
/**
* @ORM\Entity
*/
class E {
}
/**
* @ORM\Entity
*/
class F {
}
映射验证没有注意到任何问题,映射文件没问题。但是当我在表单中使用这些实体时 - > submit()我必须等待超过30秒,并且Doctrine执行超过8 000次调用。所以我认为我的映射有问题。
我不能使用任何MappedSuperClasses,因为我肯定需要oneToMany Relations。我认为问题是,A类和D类不是discriminatorMap的一部分,而且该学说无法正确映射关系。但A和D不是常规实体,因为它们只是提供基本属性。
如果没有超过8 000次学说的SELECT调用,我怎样才能实现这一目标?
谢谢!
答案 0 :(得分:1)
根据我的经验,使用类表继承适用于此类关联。
该文档指出使用此策略会对性能产生影响,但我无法相信它会生成8000个SELECT查询。