gpt4 book ai didi

symfony - Symfony2 中的 Doctrine2 (Doctrine 2.1) 急切加载

转载 作者:行者123 更新时间:2023-12-02 03:47:01 25 4
gpt4 key购买 nike

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

在我的CategoryRepository中,我有这个方法:

findAllDummy(){
return $this->createQueryBuilder('c')
->leftJoin('c.Articles a')
->getQuery()->getResult();
}

如果我没记错的话,在Symfony1.4(以及相应版本的Doctrine)中,返回的对象的'articles'属性将由相应的Article对象填充。现在,在 Symfony2 中,返回 Proxy 对象。

因此,如果我循环浏览特定类别的文章,将执行与迭代一样多的查询。

foreach($category->getArticles() as $article){
echo $article->getDoctrine()
->getRepository('')getTitle();
}

我知道这是 Doctrine2.1 的默认延迟加载行为。

问题 1:这是一个更好的解决方案吗?N 个查询而不是 1 个。

我尝试通过执行以下操作强制预先加载:

findAllDummy(){
return $this->createQueryBuilder('c')
->leftJoin('c.articles a')
->getQuery()
->setFetchMode('Category', 'articles', 'EAGER')
->getResult();
}

但结果还是一样。

问题 2:如何在 Doctrine2 中强制预先加载?

最佳答案

您正在加入一个表,但没有从中选择任何内容。将 ->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;
<小时/>

急切/惰性连接与 DQL 查询无关。它定义了使用 $articleRepository->find(123) 时应加载的内容。

关于symfony - Symfony2 中的 Doctrine2 (Doctrine 2.1) 急切加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8836384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com