我有一个User
实体与Account
实体有一对多关联:
/**
* @var Account[]
*
* @ORM\OneToMany(
* targetEntity="AppBundle\Account",
* mappedBy="user",
* cascade={"persist", "remove"},
* orphanRemoval=true
* )
*/
protected $accounts;
我提取用户列表并加入帐户:
$builder = $this->getEntityManager()->createQueryBuilder()
->select('U')
->from('Model:User', 'U')
->leftJoin('U.accounts', 'A')
;
但是,当我尝试访问用户的已获取帐户时,我可以看到Doctrine正在对数据库进行额外查询以获取每个用户的帐户。
foreach ($users as $user) {
foreach ($user->getAccounts() as $account) {
// This triggers additional Doctrine query.
var_dump($account->getId());
}
}
我将此代码作为批处理作业运行,我希望通过预先加载具有帐户的用户来实现最高性能,而不是稍后发出其他查询。
为什么Doctrine会进行其他查询以及如何防止这种情况?
我已尝试将fetch="EXTRA_LAZY"
选项用于OneToMany
关联,但没有任何运气,结果是相同的。
答案 0 :(得分:1)
您必须将account
数据添加到select语句中:
$builder = $this->getEntityManager()->createQueryBuilder()
->select('U')
->from('Model:User', 'U')
->addSelect('A')
->leftJoin('U.accounts', 'A')
;
关于提取,fetch="EXTRA_LAZY"
用于加载较少的数据。您可能希望fetch="EAGER"
自动加载相关实体。