2016-05-31 9 views
0

必須のクエリには、基本的なアカウント要件と可能なユーザー選択からなるwhereステートメントと、そのデータをペアにしたものが含まれます。次のコードは複数の選択に対して機能しません。つまり、else {}が正しくありません。 AndXの中にorXを条件付きで構築する方法はありますか?OR内にある式の条件付き数AND式ビルダーを使用した

$queryBuilder 
     ... 
     ->where(
      $queryBuilder->expr()->andX(
       $queryBuilder->expr()->eq('t.code', $queryBuilder->createPositionalParameter($this->code)), 
       $queryBuilder->expr()->neq('det.completed', '1') 
      ) 
     ); 

    if (count($selected) == 0) { 
     // no results returned 
    } 
    else if (count($selected) == 1) { 
     $queryBuilder->andWhere('det.co_id=' . $queryBuilder->createPositionalParameter($co_array[0]) . ' AND det.ct_id=' . $queryBuilder->createPositionalParameter($ct_array[0])); 
    } 
    else { 
     $nestedWhere = $this->db->createQueryBuilder(); 
     for ($i=0; $i < count($selected); $i++) { 
      $nestedWhere->expr()->orX(
       $nestedWhere->expr()->andX(
        $nestedWhere->expr()->eq('det.co_id', $nestedWhere->createPositionalParameter($co_array[$i])), 
        $nestedWhere->expr()->eq('det.ct_id', $nestedWhere->createPositionalParameter($ct_array[$i])) 
       ) 
      ); 
     } 
     $queryBuilder->andWhere($nestedWhere->expr()); // need dynamic list of orX here 
    } 

答えて

0

私はCompositeExpressionクラスを見つけました。私の問題はその正確な目的のようです。ソリューションのコードとDoctrineのドキュメントへのリンクは以下の通りです。

http://www.doctrine-project.org/api/dbal/2.3/class-Doctrine.DBAL.Query.Expression.CompositeExpression.html

// replacing the else {} in thequestion above 
else { 
    $orX = new CompositeExpression(CompositeExpression::TYPE_OR); 

    for ($i=0; $i < count($selected); $i++) { 
     $andX = new CompositeExpression(CompositeExpression::TYPE_AND); 
     $andX->add('det.co_id = :co' . (string)$i); 
     $andX->add('det.ct_id = :ct' . (string)$i); 
     $orX->add($andX); 
     $queryBuilder 
      ->setParameter("co{$i}", $co_array[$i]) 
      ->setParameter("ct{$i}", $ct_array[$i]); 
    } 
    $queryBuilder->andWhere($orX); 
} 
関連する問題