Doctrine2(Doctrine 2.1)在Symfony2中急切加载

Gui*_*dre 18 doctrine lazy-loading symfony doctrine-orm

假设我的Symfony2项目中有两个实体:CategoryArticle(包含许多文章的类别).

在我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).