2014-11-27 3 views
3

У меня есть три объекта: HandsetSubscription, Handset и Subscription.Doctrine DQL возвращает несколько типов объектов

YAML из HandsetSubscription является:

App\SoBundle\Entity\HandsetSubscription: 
type: entity 
table: handset_subscription 
manyToOne: 
    handset: 
     targetEntity: Handset 
    subscription: 
     targetEntity: Subscription      
id: 
    id: 
     type: integer 
     generator: { strategy: AUTO } 
     options: { unsigned: true } 
fields: 
    amount: 
     type: integer 
     nullable: false 
     options: { default: 0, unsigned: true } 
    discount: 
     type: integer 
     nullable: false 
     options: { default: 0, unsigned: true } 

Запрос:

SELECT hs,s,h 
     FROM \App\SoBundle\Entity\HandsetSubscription hs      
     JOIN \App\SoBundle\Entity\Subscription  s with s.id = hs.subscription 
         AND s.mins = 150 
         AND s.mb = 250 
         AND s.sms = 150 
     JOIN \App\SoBundle\Entity\Handset    h with h.id = hs.handset ​ 

Эти имена классов записей извлекаться:

App\SoBundle\Entity\HandsetSubscription 
Proxies\__CG__\App\SoBundle\Entity\Subscription 
Proxies\__CG__\App\SoBundle\Entity\Handset 
App\SoBundle\Entity\HandsetSubscription 
Proxies\__CG__\App\SoBundle\Entity\Handset 
App\SoBundle\Entity\HandsetSubscription 
Proxies\__CG__\App\SoBundle\Entity\Handset 
… 

Я ожидаю получить только Судорожные сундуки. Почему я получаю прокси-серверы и подписку?

Добавляя выборку к мобильным телефонам и подписным сопоставлениям и удаляя трубку и подписку из инструкции SELECT в запросе, я получаю только HandsetSubscription, но я хотел бы сделать это с помощью соединений fetch, как указано в руководстве (http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#joins) ,

UPDATE

Цитата из ссылки писал выше:

Fetch присоединиться по адресу:

<?php 
$query = $em->createQuery("SELECT u, a FROM User u JOIN u.address a WHERE a.city = 'Berlin'"); 
$users = $query->getResult(); 

Когда доктрина гидраты запрос с выборки присоединиться возвращает класс в FROM на корневом уровне массива результатов. В предыдущем примере возвращается массив экземпляров пользователя и адрес каждого пользователя извлекается и гидратируется в переменную адреса пользователя #. Если вы обращаетесь к адресу Doctrine, вам не нужно ленить загружать связь с другим запросом.

+1

Не 'SELECT hs, s, h', просто' SELECT hs'. Подписка и трубка будут доступны через ссылочный геттер и сеттер – SBH

+1

Таким образом, s и h будут ленивы загружаться. Я хочу, чтобы они были загружены. – madalex

+0

Я довольно shure они не будут. Не выбирайте, но сохраняйте соединение. Попробуйте! – SBH

ответ

4

Большая благодарность ветонику от канала #doctrine irc для решения этой проблемы.

Вместо того, чтобы присоединяться к полным именам сущностей, которые вы должны присоединиться к ассоциации. Таким образом, запрос становится следующим:

SELECT hs,s,h 
    FROM \App\SoBundle\Entity\HandsetSubscription hs      
    JOIN hs.subscription s with s.id = hs.subscription 
        AND s.mins = 150 
        AND s.mb = 250 
        AND s.sms = 150 
    JOIN hs.handset h with h.id = hs.handset 
+0

Отлично работает. Можете ли вы поделиться версией QueryBuilder этого DQL? Благодарю. –

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