我有一个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
存储库等。
答案 0 :(得分:2)
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)