Запрос Doctrine2 с выбором на нескольких объектах из разных пакетов Symfony2

Здравствуйте, у меня есть три объекта Doctrine2 в моем приложении Symfony2: два ( "Promo" и "PromoPeriod" ) в комплекте Acme: PromoBundle; один ( "Магазин" ) в комплекте Acme: ShopBundle. Эти отношения: Promo - PromoPeriod: Много-к-одному. PromoPeriod - Магазин: один-ко-многим.

В репозитории сущности "Промо" я стараюсь получить все промо и магазины следующим образом:

    return $this->getEntityManager()
        ->createQuery("SELECT p, s
            FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s")
            ->getResult();

где: p.period - это отношение между экземпляром Promo p и периодом PromoPeriod; pp.shops - это взаимосвязь между PromoPeriod pp и магазинами. При этом возвращается следующая ошибка:

An exception has been thrown during the rendering of a template 
("The parent object of entity result with alias 's' was not found. 
The parent alias is 'pp'.")

Итак, я утверждал, что Doctrine не способна понять тип "s" (который является объектом Shop), так как он находится в другом комплекте. Поэтому я попытался добавить предложение INSTANCE OF:

SELECT p, s
FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s
WHERE s INSTANCE OF AcmeShopBundle:Shop

И снова ничего. Возможно, это не способ решить проблему.

Любая идея?

Ответ 1

Вы должны выбрать 3 объекта, например

SELECT p, pp, s
FROM AcmePromoBundle:Promo p
JOIN p.period pp
JOIN pp.shops s

Вы выполняете объединение fetch, то есть: doctrine возвращает объекты корня запроса (здесь Promo (s)) и увлажняет его с помощью дополнительных элементов выбора. Поэтому, если вы скажете доктрине, чтобы загрузить магазины, они "приходят" из периода, но не выбирают период... он не может делать то, что вы просите об этом. Здесь SQL-запрос идет хорошо, когда доктрина пытается увлажнить объекты, которые вызывают исключение.

Прочтите соответствующую документацию http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins