2013-10-28 18 views
2

我有一個與ClassB的ManyToMany關係的ClassA,有沒有辦法通過ClassB數組選擇ClassA實體?目前我有: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實體的數組。該查詢的問題是,如果我查看具有ClassB實體1,2和3的ClassA實體,它將返回任何具有這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(); 

您需要使用Doctrine> = 2.1才能正常工作。

+0

工作就像一個魅力。謝謝! – ikleiman

+0

我遇到了另一個問題,如果我正在尋找具有ClassB 1,2,3的ClassA,並且該查詢返回任何具有這些ClassB的ClassA,儘管也有其他ClassB(即1,2,3,4; 1,2,3,5)等)。我在找的東西類似於「WHERE b =:classBEntities」有什麼想法? – ikleiman

+0

好吧,你沒有在這個問題上說這個額外的要求:)所以基本上你想'WHERE b =:classBEntites'作爲一個完全匹配...意義COUNT(b)必須匹配集合中的classBEntites的數量? – nifr