symfony2 doctrine查询构建器集合comparaison

时间:2015-04-24 15:01:56

标签: symfony doctrine

我有这些实体:

  • 用户
  • 工作
  • 语言

用户可以说一种或多种语言

作业可能需要一种或多种语言

我想针对特定的工作过滤所有具有此工作所需语言的用户。

示例:

  • User1会说英语+法语
  • User2会说英语+西班牙语
  • Job1需要英文
  • Job2需要英语+西班牙语

然后:

  • User1& User2应匹配Job1
  • User2仅匹配Job2

这是我的查询构建器:

public function getMatchingUsersFromJob($job) {
    $qb = $this->_em->createQueryBuilder();
    $qb->select('j')
        ->from('MyBundle:User', 'u')
        ->join('u.languages', 'l')
    ;
    if( $job->getLanguages()->count() > 0 ){
        $i = 1;
        foreach( $job->getLanguages() as $language) {
            $qb->andWhere('l.name = :language'.$i)
                ->setParameter('language'.$i, $language->getName() )
            ;
            $i++;
        }
    }
    return $qb->getQuery()->getResult();
}

问题是:我总是得到一个空洞的结果......

我如何比较arraycollections?并确保选择所有具有所有必需语言的用户?

2 个答案:

答案 0 :(得分:2)

您正在使用$qb->andWhere('l.name = :language'.$i)

这意味着您希望l.name必须与$language->getName()所拥有的$job相等。{
您可以将字符串中的id转换为使用$qb->Where('l.name IN :languages')

答案 1 :(得分:0)

您可以使用左连接。

Job所需的语言会加入用户口语。如果任何行已加入null,则您的用户不符合该作业的条件。如果所有行都匹配,则您的用户有资格获得该作业。