2012-03-22 42 views
11

我必須在添加where子句之後動態地將OR表達式添加到由getListQueryBuilder返回的查詢生成器中。我找不到任何合適的方法來做這件事,我剛開始學習教義。在Doctrine2查詢生成器中鏈接orX

我如何「鏈接」給定數量的orX並將它們添加到我的構建器中?

public function getListQueryBuilder($ownerId) 
{ 
    $qb = $this->createQueryBuilder('t'); 

    return $qb 
     ->where($qb->expr()->eq('t.user', ':user')) 
     ->setParameter('user', $ownerId); 
} 

$builder = getListQueryBuilder(4); 

// $ORs is a dynamically builded array, here is just an example 
$ORs = array(); 
$ORs[] = $builder->expr()->like("t.name", 'my name'); 
$ORs[] = $builder->expr()->like("t.description", 'desc'); 

// Adding ORs to the builder 
$builder->andWhere($builder->expr()->orX(/* here */)); 

回答

20

您可以檢查this solution

$orX = $builder->expr()->orX(); 
foreach($ORs as $or) { 
    $orX->add($or); 
} 
$builder->andWhere($orX); 
+7

如果你不想閱讀全文: $或X = $ builder-> EXPR() - >或X(); foreach($ ORs as $ or) { $ orX-> add($ or); } $ builder-> andWhere($ orX); – 2012-10-15 13:45:08

+1

@LouTerrailloune,應該成爲答案的一部分 – 2014-08-12 13:51:42

+0

這對我來說是詭計!歡呼指出它:) – Sharpy35 2017-11-30 15:04:55

8

我無意中發現了同樣的問題,並試圖:

$builder->andWhere($builder->expr()->orX($ORs)); 

,但它不工作,因爲或X所稱的「回報新Expr的\了Orx( func_get_args());」內部和你結束了類似陣列(陣列(OR 1,OR 2))

已經看了看API但是我想你可以這樣做:

$builder->andWhere($builder->expr()->orX()->addMultiple($ORs)); 

或做用$手術室表在所有,但問題:

$orx = $builder->expr()->orX(); 
$orx->add($builder->expr()->like("t.name", 'my name')); 
$orx->add($builder->expr()->like("t.description", 'desc')); 
$builder->andWhere($orx);