我有两个实体:一个帐户可以管理多个客户。
帐户
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个执行查询。这太过分了。如何在一个查询中将其组合在一起,以便使用帐户数据返回客户数据?
答案 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。