我有这些实体:
用户可以说一种或多种语言
作业可能需要一种或多种语言
我想针对特定的工作过滤所有具有此工作所需语言的用户。
示例:
然后:
这是我的查询构建器:
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?并确保选择所有具有所有必需语言的用户?
答案 0 :(得分:2)
您正在使用$qb->andWhere('l.name = :language'.$i)
。
这意味着您希望l.name
必须与$language->getName()
所拥有的$job
相等。{
您可以将字符串中的id转换为使用$qb->Where('l.name IN :languages')
。
答案 1 :(得分:0)
您可以使用左连接。
Job所需的语言会加入用户口语。如果任何行已加入null,则您的用户不符合该作业的条件。如果所有行都匹配,则您的用户有资格获得该作业。