Gui*_*dre 18 doctrine lazy-loading symfony doctrine-orm
假设我的Symfony2项目中有两个实体:Category和Article(包含许多文章的类别).
在我CategoryRepository,我有这个方法:
findAllDummy(){
return $this->createQueryBuilder('c')
->leftJoin('c.Articles a')
->getQuery()->getResult();
}
Run Code Online (Sandbox Code Playgroud)
如果我记得很清楚,在Symfony1.4(以及Doctrine的相应版本)中,返回的对象的"articles"属性将由相应的Article对象填充.现在,在Symfony2中,返回Proxy对象.
因此,如果我遍历特定类别的文章,将执行与迭代一样多的查询.
foreach($category->getArticles() as $article){
echo $article->getDoctrine()
->getRepository('')getTitle();
}
Run Code Online (Sandbox Code Playgroud)
我知道这是Doctrine2.1的默认延迟加载行为.
问题1:这是一个更好的解决方案?N个查询而不是1个.
我尝试通过执行以下操作强制执行加载!
findAllDummy(){
return $this->createQueryBuilder('c')
->leftJoin('c.articles a')
->getQuery()
->setFetchMode('Category', 'articles', 'EAGER')
->getResult();
}
Run Code Online (Sandbox Code Playgroud)
但结果仍然相同.
问题2:如何在Doctrine2中强行加载?
Cro*_*zin 18
你正在加入一张桌子,但你没有从中选择任何东西.添加->addSelect('a')到查询构建器.考虑以下两个SQL查询来理解差异:
SELECT a.id, a.title
FROM article a
JOIN category c ON a.category_id = c.id
WHERE a.id = 123;
SELECT a.id, a.title, c.id, c.name
FROM article a
JOIN category c ON a.category_id = c.id
WHERE a.id = 123;
Run Code Online (Sandbox Code Playgroud)
渴望/懒惰加入与DQL查询无关.它定义了使用时应该加载的内容$articleRepository->find(123).
| 归档时间: |
|
| 查看次数: |
14700 次 |
| 最近记录: |