将条件数组传递给Doctrine的expr()->orx()方法

45

我需要使用QueryBuilder构建这样的DQL语句

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

我有一个包含类型的数组,如何将该数组传递给我的查询构建器?

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

类型列表是动态的,对于每个类型循环调用$qb->andWhere将只生成更多的AND WHERE,而不是OR。
我能否存储多个orx表达式,然后将其添加到andWhere中?有什么方法可以解决这个常见问题吗?

5个回答

87

我希望如此,然后我找到了这个:

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

24
每一天都比前一天更好,可以用 $orX->addMultiple($conditions); 替换每个 foreach。 - meze
2
我已将答案更改为社区维基。@meze,欢迎您编辑并进行更改。 - DEY

15

@DEY的答案可以简化。 不需要使用foreach,以下方法同样有效:

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

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

$qb->where($orX);

12

我知道明天会是更好的一天。 解决方案很简单。你可以像这样创建一个或表达式的数组:

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

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

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

9
您可以在php中使用...,例如:
$conditions = array('e.type = x', 'e.type = Y', 'e.type = N');
$criteria = Criteria::create();
$criteria->andWhere(Criteria::expr()->orX(...$conditions));

3

您还可以使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接