Doctrine:当需要单个元素时,防止延迟加载整个集合

时间:2016-08-25 12:43:38

标签: php doctrine-orm

我有一个Parent实体与oneToMany Child的关联,与User有关。

Child中的

Parent集合已使用user_id编制索引,这意味着它使用indexBy映射选项。

Entity\Parent:
  type: entity
  oneToMany:
    children:
      targetEntity: Entity\Child
      mappedBy: parent
      indexBy: user_id 
      cascade: [ persist ]

现在,在Parent中,我想要一种能告诉我其馆藏中是否有Child特定User的方法。为此,我在Parent中有以下代码:

class Parent {
    public function hasChild(User $user) { 
        return isset($this->children[$user->getId()]);
    }
}

这可以按预期工作。

但这种方法存在性能问题。当我访问Parent::children时,Doctrine会加载整个集合,这可能是几千个或Child个实例。

有没有办法检查没有加载整个集合,但保持当前界面?我希望它可以通过Parent类完成,而不是Child存储库等。

1 个答案:

答案 0 :(得分:2)

你看过Extra Lazy Associations吗?

  

2.1版中的新功能。

     

在许多情况下,实体之间的关联可能会变得非常大。甚至在像博客这样的简单场景中。如果帖子可以评论,你总是要假设一篇文章吸引了数百条评论。在Doctrine 2.0中,如果您访问了一个关联,它将始终完全加载到内存中。如果您的关联包含数百或数千个实体,这可能会导致严重的性能问题。

     

使用Doctrine 2.1,为关联引入了一个名为Extra Lazy的功能。默认情况下,关联标记为Lazy,这意味着关联的整个集合对象在第一次访问时就会填充。如果将关联标记为非常惰性,则可以在不触发集合的完整加载的情况下调用集合上的以下方法:

     
      
  • Collection#contains($entity)
  •   
  • Collection#containsKey($key) (available with Doctrine 2.5)
  •   
  • Collection#count()
  •   
  • Collection#get($key) (available with Doctrine 2.4)
  •   
  • Collection#slice($offset, $length = null)
  •