2015-07-28 2 views
3

Когда я исполняю что-то вроде этого в Учении:назначить несколько различных Сущности в одном массиве строки в Доктрине

$qb = $doctrine 
    ->getRepository('EntityA') 
    ->createQueryBuilder('a') 
    ->addSelect('b') 
    ->join('EntityB', 'b', 'WITH', 'a.b = b') 
    ->getQuery() 
    ->getResult() 

Я получаю массив, который выглядит следующим образом:

array(0 => EntityA, 
     1 => EntityB, 
     2 => EntityA, 
     4 => EntityB) 

На самом деле, я получаю 2 строки результата, но массив, размер которого равен 4. Это делает итерацию над ним для отображения в шаблонах практически невозможным.

Я хотел бы результат, как этот:

array(0 => array(EntityA, EntityB), 
     1 => array(EntityA, EntityB)) 

Конечно, я мог бы создать отображение на EntityA, ссылающийся EntityB. Но даже с возможностью изменения поведения загрузки, LAZY, EAGER и т. Д., Может быть желательно иметь возможность создавать такие отношения «на лету».

Например:

В обзорах с большим количеством лиц, EAGER нагрузка необходима, чтобы предотвратить чрезмерное количество запросов. Но когда я хочу отображать только одну Entity и не нуждаюсь в дополнительных данных, LAZY-загрузка более желательна.

ответ

0

Поскольку вы EntityB отображается в EntityA.b, как указано это соотношение:

...join('EntityB', 'b', 'WITH', 'a.b = b')... 

Таким образом, вам не нужно на самом деле добавить b к выбрать, как вы загружаете его либо охотно или ленивый.

Удалить ->addSelect('b') из вашего строителя запросов и использовать EntityB с помощью вашего карточного EntityA.b.

Пример:

$as = $doctrine 
    ->getRepository('EntityA') 
    ->createQueryBuilder('a') 
    ->join('EntityB', 'b', 'WITH', 'a.b = b') 
    ->getQuery() 
    ->getResult(); 

foreach($as as $a){ 
    echo "EntityA property".$a->id; 
    echo "EntityB property".$a->b->id; 
} 

Этот запрос будет возвращать ArrayCollection из EntityA.

Примечание: В приведенном выше примере предполагается, что EntityA.b является государственной собственностью.

Update:

После некоторого копания я нашел эту старую должность: Doctrine 2 QueryBuilder add multiple select elements /parameters?. В соответствии с этим вы можете получить результат, который вы wan, путем прямого разделения объектов запятыми вместо использования метода ->addSelect().

Попробуйте следующие DQL:

$query = $em->createQuery("SELECT a, b FROM EntityA a JOIN a.b b") 

Запрос выше будет динамически охотно принести b.

+0

Так что я все еще на карте 'EntityB' на' A', скажем через Annotation, лениво. Присоединившись вручную, я подражаю нетерпению? Doctrine распознает извлеченные данные и устанавливает их в соответствующее поле на 'EntityA'? Это было бы аккуратно ... – Joshua

+0

@ Joshua на самом деле после изучения немного больше темы я обнаружил, что я был неправ. Согласно официальной документации: «Присоединение (будь то внутреннее или внешнее соединение) становится« присоединяемым соединением », как только поля объединенного объекта появляются в части SELECT запроса DQL вне агрегированной функции. В противном случае это «регулярное соединение» .' – Mark

+0

@ Joshua. Я буду исследовать тему немного больше сегодня и предлагаю другое решение. – Mark

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