2013-02-12 2 views
2

Это мой запрос в Symfony2-проекта, с помощью доктрины:QueryBuilder внутреннее соединение возвращает слишком много в doctrine2

$qb->select(array('r', 'fp', 'p')) 
    ->from('Farmerguide\BackendBundle\Entity\Farmerproduct', 'fp') 
    ->innerJoin('fp.product', 'p') 
    ->innerJoin('p.rubric', 'r') 
    ->andWhere('fp.farmer= :id') 
    ->setParameter('id', $farmerId); 

Информация о таблицах/организаций: Farmerproduct имеет идентификатор, farmer_id и product_id продукт имеет id, и category_id (продукт является своего рода «подкаталогом» рубрики)

Я хочу теперь все рубрики без чего-либо еще для одного фермера. Но я получаю сообщение об ошибке, когда я изменить select -части, он говорит, что нужно все joined Entitys быть выбрано ...

Ну, теперь я получаю все присоединилось к информации, так и для 100 продукты 1 фермера, я получаю каждый товар с рубрикой и с фермером (я не знаю, почему я тоже получаю фермера ..)

Любые предложения?

ответ

3

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

SELECT 
    r 
FROM 
    Farmerguide\BackendBunle\Entity\Rubric r 
WHERE 
    r.id IN (
     SELECT 
      r2.id 
     FROM 
      Farmerguide\BackendBundle\Entity\Farmerproduct fp 
     JOIN 
      fp.product p 
     JOIN 
      p.rubric r2 
     WHERE 
      fp.farmer = :id 
    ) 

QueryBuilder В API, это выглядит следующим образом:

$qb1 = $em->createQueryBuilder(); 
$qb2 = $em->createQueryBuilder(); 

$qb2 
    ->select(array('r2.id')) 
    ->from('Farmerguide\BackendBundle\Entity\Farmerproduct', 'fp') 
    ->innerJoin('fp.product', 'p') 
    ->innerJoin('p.rubric', 'r2') 
    ->andWhere('fp.farmer= :id') 

$qb1 
    ->select('r') 
    ->from('Farmerguide\BackendBunle\Entity\Rubric', 'r') 
    ->where($qb->expr()->in('r.id', $qb2->getDQL())) 

$rubrics = $qb1 
    ->setParameter('id', $farmerId) 
    ->getQuery() 
    ->getResult(); 

Если вы на самом деле не нужен QueryBuilder здесь, следует использовать обычный DQL: как вы видите, это проще.

+0

Отлично! Работает на меня. Спасибо – eav

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