41

我需要用QueryBuilder这样的方式构建 DQL

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

我在数组中有类型如何将这个数组传递给我的查询生成器?

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

类型列表将是动态的,调用$qb->andWhere每个 foreach 类型循环只会产生更多 AND WHERE 不再有 OR。
我可以存储乘法orx表达式然后将其添加到andWhere?知道如何解决这个可能是常见问题吗?

4

5 回答 5

83

我希望如此,然后我发现了这个:

$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);
于 2013-04-16T20:22:18.227 回答
14

@DEY 他的答案可以简化。不需要 foreach,这也有效:

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

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

$qb->where($orX);
于 2015-08-27T13:04:50.190 回答
12

我知道明天会更好。解决方案很简单。您可以像这样制作 OR 表达式数组

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

然后只需通过 join 方法将其添加到查询构建器的 andWhere()/Where() 方法中,如下所示:

$qb->andWhere(join(' OR ', $ors));
于 2012-07-29T11:36:18.063 回答
9

您也可以...在 php 中使用,例如:

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N');
$criteria = Criteria::create();
$criteria->andWhere(Criteria::expr()->orX(...$conditions));
于 2018-01-26T08:55:36.583 回答
2

您也可以像这样使用call_user_func_array函数。

它允许您调用将数组项作为参数传递的方法。

例如:

$conditions = array('e.type = x', 'e.type = Y', 'e.type = N');
$expr = $qb->expr();
call_user_func_array(array($expr, 'orX'), $conditions);
于 2012-09-05T18:34:11.017 回答