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