【问题标题】:symfony2 doctrine query builder collection comparaisonsymfony2 学说查询生成器集合比较
【发布时间】:2015-07-03 06:13:33
【问题描述】:

我有这些实体:

  • 用户
  • 工作
  • 语言

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

一项工作可能需要一种或多种语言

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

例子:

  • 用户 1 会说英语 + 法语
  • 用户 2 会说英语 + 西班牙语
  • 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();
}

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

如何比较数组集合?并确保选择所有具有所有必需语言的用户?

【问题讨论】:

    标签: symfony doctrine


    【解决方案1】:

    您可以使用左连接。

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

    【讨论】:

      【解决方案2】:

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

      这意味着您希望l.name 必须等于您的$job 拥有的许多$language->getName()

      您可以将字符串中的 id 转换为使用 $qb->Where('l.name IN :languages')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 2012-12-07
        相关资源
        最近更新 更多