Php 条令2 DQL-按精确多目标阵列选择

Php 条令2 DQL-按精确多目标阵列选择,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我有一个与ClassB有很多关系的ClassA,有没有办法通过ClassB数组选择ClassA实体?目前我有: $query = $em->createQuery(" SELECT a FROM Bundle:ClassA a JOIN a.classB b WHERE b IN (:classBEntities) ") ->setParameter('classBEntities', $classBEntities); $classbe

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

$query = $em->createQuery("
    SELECT a FROM Bundle:ClassA a 
    JOIN a.classB b 
    WHERE b IN (:classBEntities)
    ")
    ->setParameter('classBEntities', $classBEntities);
$classbenties是一个ClassB实体数组。该查询的问题是,如果我查找具有ClassB实体1、2和3的ClassA实体,它将返回任何具有这3个ClassB实体中的一个以及具有这3个ClassB实体中的一个的ClassA实体,但我需要只选择具有数组包含的所有实体的ClassA实体

$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才能运行此功能。

在使用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();

工作得很有魅力。谢谢我遇到了另一个问题,如果我用该查询查找具有类1,2,3的ClassA,它将返回任何具有这些类的ClassA,尽管还有其他类(即1,2,3,4;1,2,3,5)等等)。我要找的是类似于“WHERE b=:classbenties”的东西有什么想法吗?你没有在问题中提到这个额外的要求:)所以基本上你想要“WHERE b=:classbenties”作为一个精确的匹配。。。意思是计数(b)必须与集合中的ClassBentite数量相匹配?谢谢!这应该够了,但多亏了它,我发现了另一个问题。在foreach子句中,每次迭代都会覆盖b_实体,因此如果我查找1,2,3,它会查找3,3,3并返回它(我以前看到的结果是每个“a”中的“b”=3)。我已更改为->setParameter('b_entity'.$I,array($entity)),它以查找1,2,3的方式工作,但没有返回任何内容。我看过分析器,它说“不可能在哪里”,带有查询摘录:,b1_2;id IN(?)和b1_2;id IN(?)以及b1_2;id IN(?)参数:[[1],[2],[3]]。应该是这样吗?