2012-07-28 23 views
22

我需要構建DQL與QueryBuilder這樣通陣列教義EXPR() - > ORX()方法

[QUERY]... AND WHERE e.type = x OR e.type = Y OR e.type = N [...] 

我有數組類型如何傳遞這個數組我的查詢生成器?

$qb->andWhere($qb->expr()->orx(CONDITIONS)); 

類型列表將是動態的,呼籲各類型的foreach循環$qb->andWhere將使只有更哪來沒有更多的OR值。
我可以存儲乘以orx的表達式,然後將其添加到andWhere?任何想法如何解決這個問題,可能是常見問題?

回答

5

我知道tommarow會是更美好的一天。 解決方案很簡單。您可以撥打或表達式的陣列,像這樣

$ors[] = $qb->expr()->orx('e.type = '.$qb->expr()->literal($value)); 

然後只需將其添加到andWhere()/在哪裏()通過查詢生成器的方法連接方法如下所示:

$qb->andWhere(join(' OR ', $ors)); 
50

我希望如此,後來我發現這一點:

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N'); 
$orX = $qb->expr()->orX(); 

foreach ($conditions as $condition) { 
    $orX->add($condition); 
} 

$qb->add('where', $orX); 

使用@meze建議,你可以簡化代碼,並與更換的foreach語句

$orX->addMultiple($conditions); 
+16

每一天比以前好,的foreach可以替換'$ orX-> addMultiple($ conditions);' – meze 2013-08-02 07:51:15

+1

我已經更改社區wiki的答案。 @meze,歡迎您隨着您的更改進行編輯。 – DEY 2015-02-20 11:16:30

5

@DEY他的回答可以簡化。 無需對foreach,這也適用:

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N'); 

$orX = $qb->expr()->orX(); 
$orX->addMultiple($conditions); 

$qb->where($orX); 
0

您還可以使用...在PHP中,如:

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N'); 
$criteria = Criteria::create(); 
$criteria->andWhere(Criteria::expr()->orX(...$conditions));