Symfony createQueryBuilder具有多对多功能
在我的系统中,候选人和职业有多对多的关系。我需要在symfony中实现以下查询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
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。所以它也没有问题。