使用抽象基类进行Doctrine继承映射

时间:2014-02-19 19:48:43

标签: forms symfony doctrine-orm mapping submit

我对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调用,我怎样才能实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:1)

根据我的经验,使用类表继承适用于此类关联。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#class-table-inheritance

该文档指出使用此策略会对性能产生影响,但我无法相信它会生成8000个SELECT查询。