防止Doctrine获取相关实体

时间:2016-12-28 00:32:59

标签: php symfony doctrine-orm

我有一个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关联,但没有任何运气,结果是相同的。

1 个答案:

答案 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"自动加载相关实体。