2015-06-05 3 views
3

У меня есть два объекта: одна учетная запись может управлять несколькими клиентами.Symfony2 - Doctrine OneToMany Select-Issue

Счет

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(); 

Это отлично работает нормально, но при обращении к клиенту-данные другого запрос запускается на выполнение для каждого клиента. Это означает, что у меня есть 101 выполненный запрос при печати 100 клиентов. Это слишком много. Как я могу объединить это в одном запросе, чтобы данные клиента возвращались с данными учетной записи?

+0

попробовать $ qb-> GetResult (Doctrine \ ORM \ Query :: HYDRATE_ARRAY) ;, это может предотвратить случайную отложенную загрузку (кажется, есть некоторая ленивая загрузка происходит) – wonde

+0

При использовании HYDRATE_ARRAY тогда я только получаю массив учетной записи. Клиентов нет. Как мне настроить свой запрос? – chrisp

+0

У вас есть полный пример [здесь] (http://www.inanzzz.com/index.php/post/djrc/full-webform-style-crud-example-with-an-embedded-associated-entity-in- Symfony). Включает Entity, Repository, FormType, Twig. – BentCoder

ответ

0

Итак, это особенность Doctrine2. Все отношения ленивые нагрузки, если вы хотите получить к нему доступ.

В качестве решения вы можете выполнить change fetch mode перед выполнением запроса.

+0

Есть ли способ проверить, используется ли правильный режим выборки? Я попытался включить его, но нет никакой разницы. – chrisp

1

Добавление клиентов в метод select может сделать трюк, чтобы минимизировать выполненные запросы.

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

Это приводит к возврату учетных записей и клиентов отдельно (array (20) {# Account} array (4) {#Customer} array (20) {#Customer} array (4) {#Account} ...} - Мне нужно Клиенты в массивах учетных записей, в противном случае я не могу перебирать результат в моем шаблоне Twig. – chrisp

+0

Вы подтвердили, что запрос уменьшен? Как ваша информация по ветке дает результат? – ihsan

+0

В моем шаблоне ветка у меня будет {% для клиента в accounts.customers%}. – chrisp

Смежные вопросы