【发布时间】:2015-12-11 04:35:28
【问题描述】:
我正在使用 Symfony 2.8 / Doctrine ORM 2.5.2。
我有 2 个实体,Gallery OneToMany File
class Gallery
{
/**
* @var File[]
*
* @ORM\OneToMany(targetEntity="File", mappedBy="gallery", fetch="EAGER")
*/
private $files;
}
我在文档中看到了两件事。
首先,现在 OneToMany 关系确实具有 fetch=EAGER 选项 (specified here)。以前的版本中没有。
其次,对于 OneToMany 来说,每个查询的这种 fetch 方法的手动设置似乎不可用,但我不知道 the documentation 是否是最新的,因为它指出:
在查询期间更改获取模式仅适用于一对一 和多对一关系。
我都试过了,这是我的问题:
public function findWithEager()
{
$qb = $this->createQueryBuilder('g');
$query = $qb->getQuery();
$query->setFetchMode("CommonBundle\\Entity\\Gallery", "files", ClassMetadata::FETCH_EAGER);
return $query->getResult();
}
但是当我这样做时:
foreach ($galleryRepository->findWithEager() as $gallery) {
foreach ($gallery->getFiles() as $file) {
$file->getId();
}
}
然后我收到了 1+n 个查询。第一个是SELECT * FROM Gallery,后面的n个是SELECT * FROM File WHERE id = :galleryId
我希望 Doctrine 做 1+1 查询,第二个是 SELECT * FROM File WHERE id IN (:galleryListIds)
我错过了什么吗?这种行为是否在 Doctrine 中实现?
当使用 fetch="EAGER" 标记一对多关联时,它现在会 比以前少执行一个查询,并在组合中正常工作 使用 indexBy。
完全不清楚预期的行为是什么。
欢迎任何见解,谢谢!
【问题讨论】:
-
您使用的是哪个版本的 Doctrine?应该是 2.5。
-
我正在使用学说 orm v2.5.2。
-
如果你使用 queryBuilder 来检索你的对象,你应该使用 leftJoin,而不是 fetch 策略:/ 你是否也尝试过使用普通 ->findAll() 和你的循环文件?
标签: symfony doctrine-orm