Symfony createQueryBuilder有很多对很多

时间:2015-05-25 07:32:45

标签: 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')
            ->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. 

我如何实现该查询?

2 个答案:

答案 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”子句的东西