Symfony2 - Doctrine OneToMany Select-Issue

时间:2015-06-05 19:12:57

标签: php symfony doctrine-orm dql

我有两个实体:一个帐户可以管理多个客户。

帐户

class Account {
    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Account", mappedBy="account", cascade={"persist"})
     */
    protected $customers;
}

客户

class Customer {
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Account", inversedBy="customers", cascade={"persist"})
     * @ORM\JoinColumn(name="accountid", referencedColumnName="id", nullable=true)
     */
    protected $account;

    # + other ManyToMany-Relations
}

现在我想在我的Twig模板中选择所有帐户并打印客户数据。所以我使用以下查询:

$qb = $this->getEntityManager()->createQueryBuilder();
$customers = $qb->select('acc')
    ->from('AppBundle:Account', 'acc')
    ->leftJoin('AppBundle:Customer', 'customer', 'WITH', 'customer MEMBER OF acc.customers')
    ->where('customer.active = true')
    ->orderBy('acc.id', 'ASC')
    ->getQuery()
    ->getResult();

这非常好用,但在访问客户数据时,会为每个客户执行另一个查询。这意味着我在打印100个客户时有101个执行查询。这太过分了。如何在一个查询中将其组合在一起,以便使用帐户数据返回客户数据?

2 个答案:

答案 0 :(得分:1)

在select方法中添加客户可以最大限度地减少执行的查询。

$customers = $qb->select('acc, customer')
    ->from('AppBundle:Account', 'acc')
    ->leftJoin('AppBundle:Customer', 'customer', 'WITH', 'customer MEMBER OF acc.customers')
    ....
;

答案 1 :(得分:0)

所以,这是Doctrine2的特色。如果你想访问它,所有关系都会延迟加载。

作为解决方案,您可以在执行查询之前change fetch mode