【问题标题】:Symfony2 - Doctrine OneToMany Select-IssueSymfony2 - Doctrine OneToMany Select-Issue
【发布时间】:2015-06-06 16:34:17
【问题描述】:

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

帐户

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 个查询。这太过分了。如何在一个查询中结合使用,以便将客户数据与帐户数据一起返回?

【问题讨论】:

  • 尝试 $qb->getResult(Doctrine\ORM\Query::HYDRATE_ARRAY);,这可能会防止意外延迟加载(似乎有一些延迟加载正在进行)
  • 当使用 HYDRATE_ARRAY 时,我只得到一个帐户数组。不包括客户。我需要如何调整我的查询?
  • 你有一个完整的例子here。包括实体、存储库、FormType、Twig。

标签: php symfony doctrine-orm dql


【解决方案1】:

在 select 方法中添加客户可以减少执行的查询。

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

【讨论】:

  • 导致账户和客户分别返回 (array(20) { # Account } array(4) { #Customer } array(20) { #Customer } array(4) { #Account } 。 ..} - 我需要 Account 数组中的客户。否则我无法在我的 Twig 模板中迭代结果。
  • 您确认查询减少了吗?您的树枝如何访问结果?
  • 在我的树枝模板中,我会有一个 {% for customer in accounts.customers %}。
  • 更新您的问题,以便我可以根据它更新我的答案。
【解决方案2】:

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

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

【讨论】:

  • 有没有办法检查是否使用了正确的获取模式?我尝试启用它,但没有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多