Doctrine 2 DQL - 按精确的ManyToMany数组选择

时间:2013-10-28 00:14:00

标签: php symfony doctrine-orm

我的ClassA与ClassB有一个ManyToMany关系,有没有办法通过ClassB数组选择ClassA实体?目前我有:

$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实体以及具有其中三个实体的实体,但是我只需要选择包含数组所包含的所有实体的那些。

2 个答案:

答案 0 :(得分: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才能使用。

答案 1 :(得分: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();