Symfony createQueryBuilder具有多对多功能

Symfony createQueryBuilder具有多对多功能,symfony,doctrine-orm,Symfony,Doctrine Orm,在我的系统中,候选人和职业有多对多的关系。我需要在symfony中实现以下查询 SELECT c. * FROM candidate AS c LEFT JOIN candidate_profession AS cp ON cp.candidate_id=c.id WHERE cp.profession_id = 2 所以我写了下面的代码 $matched = $em->getRepository('AppBundle:Candidate') ->creat

在我的系统中,候选人和职业有多对多的关系。我需要在symfony中实现以下查询

SELECT c. *
FROM candidate AS c
LEFT JOIN candidate_profession AS cp ON cp.candidate_id=c.id
WHERE cp.profession_id = 2
所以我写了下面的代码

$matched = $em->getRepository('AppBundle:Candidate')
            ->createQueryBuilder('c')
            ->where('c.professions = :profession')
             ->setParameter('profession', $job->getProfession())
             ->getQuery()
             ->getResult();
$job->getProfession是返回的profession对象。但它显示以下错误

[Semantical Error] line 0, col 51 near 'professions =': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected. 

我如何实现这个查询

我认为您的查询应该如下所示:

$em->getRepository('AppBundle:Candidate')
    ->createQueryBuilder('c')
    ->leftJoin('c.professions', 'p')
    ->where('p.id = :profession')
    ->setParameter('profession', $job->getProfession())
    ->getQuery()
    ->getResult();
关于join子句的更多信息:

首先,我不知道您将这段代码放在了哪里,但我强烈建议您将其迁移到一个中,如果您还没有这样做,但查看代码,我不确定您是否有

其次,您需要将ID传递为->getProfession,因为您已经注意到它将返回整个对象,而您不需要它

所以您的查询应该是这样的

$matched = $em->getRepository('AppBundle:Candidate')
            ->createQueryBuilder('c')
            ->where('c.professions = :profession')
            ->setParameter('profession', $job->getProfession()->getId())
            ->getQuery()
            ->getResult();
请注意
您没有指定job和profession之间关系的基数:如果对许多人来说是一个东西,那么您不能简单地使用->getId作为返回的对象,因为它是一个ArrayCollection,因此,在这种情况下,您需要执行一个循环来提取所有ID,然后使用类似于in子句的内容。不,这根本不是正确的答案。错误是进入setParameter而不是进入查询结构我的存储库是正确的。我也试过了$job->getProfession->getId,但它显示了相同的错误$作业->获取专业->获取ID返回值为3。所以它也没有问题。