具有多个 OR 条件的 ZF2 Doctrine 查询

Ron*_*ott 1 doctrine mariadb symfony doctrine-orm

我写了以下 Dotrine 查询:

        $query3 = $this->entityManager
            ->createQueryBuilder()
            ->select('t.textDomain , t.translationKey , t.languageIso , t.translationDate')
            ->from(
                'AMDatabase\Entity\TheVerse\TranslationsMasters',
                't'
            )
            ->groupBy('t.languageIso')
            ->orderBy(
                't.translationDate',
                'DESC'
            );

// the values of $key2 array are:
// en-US
// es-MX
// es-PR

        foreach( $translation AS $key2=>$value2 ) {               

            if ( $key2 == 'en-US' ) {

                $query3
                    ->orWhere(
                        $query3->expr()
                               ->like(
                                   't.languageIso',
                                   ':languageIso'
                               )
                    )
                    ->setParameter(
                        'languageIso',
                        $key2
                    );

            }

        }

        $result3 = $query3->getQuery()
                          ->getArrayResult();
Run Code Online (Sandbox Code Playgroud)

如何同时查询搜索所有 3 种语言的 ISO ?

  • 使用“if ($key2 == 'en-US') {”执行查询并给出预期结果。
  • 但如果我删除“if ($key2 == 'en-US') {”,则没有搜索结果。

我认为通过使用“orWhere”它会不断向查询添加条件(其中 en-US 仍会产生匹配)。

jcr*_*opp 5

一直无法按照orWhere我认为应该的方式运行。您可能需要Where在开始定义中添加一个,然后才能添加orWhere以后的定义。您可能必须使用orX这样的嵌套语句:

$query3->andWhere($query3->expr()->orX(
    $query3->expr()->like('t.languageIso', $query3->expr()->literal('en-US')),
    $query3->expr()->like('t.languageIso', $query3->expr()->literal('es-MX')),
    $query3->expr()->like('t.languageIso', $query3->expr()->literal('es-PR'))
));
Run Code Online (Sandbox Code Playgroud)

您不能通过循环来开发该语句。但是,由于您只有三个标准,因此很容易写出来。