Symfony 2 docnrine и выборка связаных сущностей?

Только столкнулся с Symfony 2, поэтому появилась небольшая трудность по незнанию всех тонкостей, собственно вопрос:
Есть 3 сущности Login, Campain, Banner, они соответственно взаимосвязаны Login имеет ArrayCollection c связанными Campain, она в свою очередь коллекцию с её Banner
/**
* @ORM\OneToMany(targetEntity="Campain", mappedBy="Login", indexBy="CampaignID", cascade={"persist", "remove" })
*/
protected $Campains;

/**
 * @ORM\OneToMany(targetEntity="Banner", mappedBy="Campain", indexBy="BannerID", cascade={"persist", "remove" })
*/
protected $Banners;

Можно ли составить запрос, чтобы без ленивой загрузки за 1 раз создать объект Login с уже загруженными всеми связанными Campain и для каждой из них тоже выбрались связанные Banner?

Пробовал такую конструкцию в репозитории, не получается
$this->getEntityManager()->createQuery('
SELECT Login, Campain, Banner
 FROM BroAppBundle:Login Login
 LEFT JOIN Login.Campains Campain
 LEFT JOIN Campain.Banners Banner
 WHERE Login.User=:user_id')
->setParameter('user_id', $user_id)->getResult();

Таблицы присоединяются, но сущности не группируются и когда вызываю например цикл
foreach($Logins as $Login){
  foreach($Login->getCampains() as $Campain){
    $Campain->GetBanners();
  }
}

каждую итерацию идут запросы к базе на выборки.
  • Вопрос задан
  • 4041 просмотр
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
вы можете указать в описании отношений метод выборки EAGER, при котором ваши связанные сущности всегда будут выбираться через outer join, хотя лучше указывать это там, где это нужно, и именно для запроса.
$this->getEntityManager()->createQuery('
SELECT l FROM BroAppBundle:Login l
WHERE  Login.User=:user_id')
->setParameter('user_id', $user_id)
->setFetchMode("BroAppBundle:Login", "Campains", "EAGER")
->setFetchMode("BroAppBundle:Login", "Banners", "EAGER")
->getResult();

p.s. код может не работать, ибо я уже точно не помню как там что. Читайте доки и пробуйте.
Ответ написан
agladkov
@agladkov
www.uvd.co.uk/blog/some-doctrine-2-best-practices

$data = $em->createQueryBuilder()
    ->select(array('l', 'c', 'b'))
    ->from('BroAppBundle:Login', 'l')
    ->leftJoin('l.Campains', 'c')
    ->leftJoin('c.Banners', 'b')
    ->getQuery()
    ->getResult();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы