Doctrine OneToOne / ManyToOne与表继承的关联

时间:2015-05-27 07:54:41

标签: php oop inheritance orm doctrine

Doctrine中有单表继承(STI)和类表继承(CTI)的“general performance consideration”:

  

如果多对一或一对一关联的目标实体是STI / CTI实体,则出于性能原因,它最好是继承层次结构中的叶实体(即具有没有子类)。否则,Doctrine不能创建该实体的代理实例,并且总是急切地加载该实体。

a SO answer中的@timdev非常清楚地说明了这个问题:

abstract class Pet { ... }
class Cat extends Pet { ... } 
class Dog extends Pet { ... }

class Collar {
   /** @Column(length="16") */
   protected $color;

   /** ManyToOne(targetEntity="Pet")*/
   protected $owner;
}
  

现在,如果你想迭代所有的蓝色项圈,Doctrine会遇到麻烦。它不知道$ owner所属的类,因此它不能使用代理。相反,它被迫急切地加载$ owner来查明它是猫还是狗。

好的,所以我的问题是:如果我需要迭代我的应用中的蓝色项圈(例如,因为我希望它们列在网页中)。

解决性能问题的建议解决方案是什么?我应该切换到ManyToMany关联,即使它没有多大意义,或重新考虑我的数据建模?

0 个答案:

没有答案