在我的系统中,候选人和职业有很多很多关系。我需要在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()
是返回职业对象。但它显示以下错误。
[Semantical Error] line 0, col 51 near 'professions =': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.
我如何实现该查询?
答案 0 :(得分:0)
我认为您的查询应如下所示:
$em->getRepository('AppBundle:Candidate')
->createQueryBuilder('c')
->leftJoin('c.professions', 'p')
->where('p.id = :profession')
->setParameter('profession', $job->getProfession())
->getQuery()
->getResult();
有关加入条款的更多信息:http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#join-clauses
答案 1 :(得分:0)
首先,我不知道您放置了哪段代码,但我强烈建议您将其迁移到Repository,如果您还没有完成(但看着代码,我不确定你有没有)
第二次,您需要传递一个ID为->getProfession()
(正如您已经注意到的)将返回整个对象而您不需要它
所以你的查询应该是这样的
$matched = $em->getRepository('AppBundle:Candidate')
->createQueryBuilder('c')
->where('c.professions = :profession')
->setParameter('profession', $job->getProfession()->getId())
->getQuery()
->getResult();
你没有指定工作和职业之间关系的基数:如果是某事对多数,你不能简单地使用->getId()
作为返回的对象是{{ 1}},所以,在这种情况下,你需要做一个循环来提取所有的id,然后使用类似“IN”子句的东西