2016-07-19 3 views
0

Имея некоторые проблемы с получением отношений ManytoOne при использовании левого соединения.Использование левого соединения с достройкой запросов builder

Перед использовал этот запрос для запроса конференций

$qb = $this->createQueryBuilder('u') 
->select('u.id,u.comment, 
IDENTITY(u.place) AS place_id, 
IDENTITY(u.sponsor) AS sponsor_id, 
IDENTITY(u.tour) AS tour_id, 
u.startat 
'); 

Теперь я пытаюсь налево присоединиться к диффузии, которая привязана к диффузии в отношения многие ко многим.

$qbt = $this->createQueryBuilder('u') 
     ->select('u','c') 
     ->from('AppBundle:Conference', 'p') 
     ->leftJoin('p.diffusion', 'c'); 

Однако этот запрос не возвращает u.place, u.sponsor и u.tour которые ManyToOne отношения.

+1

что он возвращает? – Splendonia

+0

Предполагая, что у вас есть все ваши настройки отношений, то объекты, о которых вы упомянули, будут ленивы загружены. Конечно, вы никогда не выбираете u, поэтому ваш запрос не будет работать независимо. – Cerad

+0

Personnaly, я ненавижу QueryBuilder (или даже DQL), когда приходится иметь дело с объединениями. Я иду с классом NativeQuery. http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/native-sql.html Надеюсь, что @Cerad вмешивается здесь и делится с нами своей мыслью об этом. –

ответ

1

leftJoin должен сопровождаться 'WITH'. Так, например:

->leftJoin('p.diffusion', 'p', 'WITH', 'p.user=u.id', 'u.id'); 

Но я думаю, что лучше разместить оба объекта, чтобы я мог дать вам точный ответ.

+2

Ну нет. DQL немного умнее SQL и выводит предложение WITH из данных сопоставления. – Cerad

0

Найдено вопрос, я должен был добавить -> setHint (\ Doctrine \ ORM \ Query :: HINT_INCLUDE_META_COLUMNS, правда) к GetQuery, потому что getArrayResults по умолчанию не возвращает внешние ключи (место, спонсором и осмотрительно).

Вот мой последний запрос в хранилище конференции

 $qbt = $this->_em->createQueryBuilder(); 
     $qbt->select('conference','diffusion') 
     ->from('AppBundle:Conference', 'conference') 
     ->leftJoin('conference.diffusion', 'diffusion'); 

    return $qbt 
     ->getQuery() 
     ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true) 
     ->useQueryCache(true) 
     ->useResultCache(true,3600) 
     ->getArrayResult(); 
Смежные вопросы