2013-10-28 4 views
2

У меня есть ClassA с отношением ManyToMany к ClassB, есть ли способ выбора объектов ClassA массивом ClassB? В настоящее время у меня есть:Doctrine 2 DQL - выберите точный массив ManyToMany

$query = $em->createQuery(" 
    SELECT a FROM Bundle:ClassA a 
    JOIN a.classB b 
    WHERE b IN (:classBEntities) 
    ") 
    ->setParameter('classBEntities', $classBEntities); 

Будучи $ classBEntities массивом объектов ClassB. Проблема с этим запросом заключается в том, что если я ищу объект ClassA с объектами 1, 2 и 3 класса ClassB, он возвращает любой объект ClassA, который имеет один из этих трех объектов ClassB, а также тот, который имеет три из них, но Мне нужно выбрать только те, у которых есть все сущности, которые содержит массив.

ответ

1

После нескольких проб и ошибок, используя nifr ответ, который я получил решение, вот если кто-то столкнулся с той же проблемой:

$queryBuilder = $em->getRepository('Bundle:ClassA') 
        ->createQueryBuilder('a') 
        ->join('a.classB', 'b'); 
        ->groupBy('a.id') 
        ->having('COUNT(b) = :cB') 
        ->setParameter('cB', count($classBEntities)); 

      foreach ($classBEntities as $entity) 
      { 
       $id = $entity->getId(); 
       $queryBuilder 
       ->join('a.classB', 'b'.$id) 
       ->andWhere('b'.$id.'.id IN (:b_entity'.$id.')') 
       ->setParameter('b_entity'.$id, array($id)); 
      } 

$result = $queryBuilder->getQuery()->getResult(); 
2
$queryBuilder = $em 
    ->getRepository('Bundle:ClassA') 
    ->createQueryBuilder('a') 
    ->leftJoin('a.classB', 'b') 
; 

foreach ($classBentities as $entity) { 
    $queryBuilder 
     ->andWhere('b IN (:b_entity)') 
     ->setParameter('b_entity', array($entity)) 
    ; 
} 

$queryBuilder 
    ->add('where', $queryBuilder->expr()->count('b'), '=' , ':count_b') 
    ->setParameter('count_b', count($classBentities)) 

$result = $queryBuilder->getQuery()->getResult(); 

Для этого вам понадобится Доктрина> = 2.1.

+0

работал как шарм. Благодаря! – ikleiman

+0

Я столкнулся с другой проблемой, если я ищу ClassA с ClassBs 1,2,3 с этим запросом, он возвращает любой ClassA, у которого есть эти ClassB, несмотря на то, что у них есть и другие (т.е. 1,2,3,4; 1,2,3,5) и т. Д.). То, что я ищу, похоже на «WHERE b =: classBEntities». Любые мысли? – ikleiman

+0

хорошо, что вы не сказали что-то об этом дополнительном требовании в вопросе :), так что в основном вы хотите, чтобы 'WHERE b =: classBEntites 'как точное совпадение ... значение COUNT (b) также должно соответствовать количеству классовBEntites в коллекции ? – nifr

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