所以,我想了解Doctrine Repository机制的工作原理。
对于我的实体,我使用注释,因此生成的对象在脚本执行期间的某处构建。
我想unserstand哪些是实现从另一个实体延迟加载实体的可能方法。
具体来说,使用Doctrine,我有fetch information of related object (from the Symfony book)的能力。这种提取是以一种懒惰的方式完成的:只有当我调用该方法获取有关实体的信息时,它才会从查询它的数据库中加载。
现在,我想更好地理解这种机制:实体如何实现存储库方法? 如何重现此机制以在类似于数据库数据检索的其他上下文中实现它?
由于产生的对象非常大,是否有人可以让我走上正确的道路? 我应该阅读哪些课程来理解机制? 是否有任何文章/帖子可以更好地解释如何实施这种机制? 是否有更好(或更简单)的方法来实现它?
答案 0 :(得分:1)
Doctrine实际创建了一个额外的对象(思考代理),用于记录实际访问过的属性。
从文档中查看此部分:
Doctrine使用代理对象的第二个最重要的情况是查询对象时。每当您查询与另一个配置为LAZY的对象具有单值关联的对象时,如果不在同一查询中加入该关联,Doctrine会将代理对象置于通常关联对象所在的位置。就像其他代理一样,它会在第一次访问时透明地初始化。
答案 1 :(得分:1)
我认为延迟加载的最佳描述可以在Doctrine开发人员文章中找到。 http://www.giorgiosironi.com/2009/07/lazy-loading-of-objects-from-database.html http://www.giorgiosironi.com/2009/08/doctrine-2-now-has-lazy-loading.html
主要思想是在Product的类别列表中插入一组作为Category子类的对象。这些和被称为"代理对象"并在飞行中创造了#34;"从数据库中检索产品时。这些代理对象具有与Category对象相同的接口,但添加了在需要时从数据库加载实际Category项的功能。
答案 2 :(得分:0)
您可以为实体创建自定义存储库:http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes
拥有自己的自定义存储库类后,您可以创建查询,以便在一个查询中获取所需的所有信息,而不是依赖于延迟加载。
因此,假设您有一个Product实体,其中包含一个或多个使用ManyToMany关系的Category实体,您可以在自定义存储库中创建一个函数,以便在一个查询中获取其类别的所有产品:
public function fetchProductsWithCategories()
{
return $this->getEntityManager()
->createQuery(
'SELECT p, c FROM Product p join p.categories c'
)
->getResult();
}
然后在你的控制器中你会有类似的东西:
$repo = $this->getDoctrine()->getManager()->getRepository('Product');
$products = $repo->fetchProductsWithCategories();
编辑:在选择
中错过了c