2015-04-30 3 views
0

Я написал следующее Doctrine запрос:ZF2 Doctrine Query С Multiple ИЛИ Условия

 $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(); 

Как выполнить поиск запроса для всех 3 языка ИС в то же время?

  • С "if ($ key2 == 'en-US') {" запрос выполняется и дает мне ожидаемый результат.
  • Но если я удалю "if ($ key2 == 'en-US') {" нет результатов поиска.

Я думал, что с помощью «orWhere» он будет добавлять условия к запросу (где en-US все равно будет производить соответствие).

+0

Вы пытались вызвать 'getSQL()' вместо 'getQuery()', чтобы увидеть сгенерированный SQL-запрос? orWhere кажется капризным: http://stackoverflow.com/questions/6878448/doctrine-or-where – Ulti

+0

Я обнаружил свою проблему. Я использовал: languageIso. Исключительно связанный язык ISO был найден во всех случаях. Простое изменение разрешило это: –

+0

$ i = 1; Еогеасп ($ перевод AS $ key2 => $ значение2) { $ query3 -> orWhere ( $ query3-> выражение() -> как ( 't.languageIso', . ': LanguageIso' $ i ) ) -> setParameter ( 'languageIso'. $ i, $ key2 ); ++ $ i; } –

ответ

2

Не удалось получить 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')) 
)); 

Вы не можете разработать заявление через петлю. Но, поскольку у вас есть только три критерия, их достаточно просто написать.