将条件数组传递给条令exp()->;orx()方法


pass array of conditions to doctrine expr()->orx() method

我需要用类似的QueryBuilder构建DQL

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

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

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

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

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

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

@DEY他的答案可以简化。无需foreach,这也适用:

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

我知道tommarow会是更好的一天。解决方案很简单。你可以制作一个类似的OR表达式数组

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

然后通过连接方法将其添加到查询生成器的andWhere()/Where()方法中,如下所示:

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

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

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

您也可以像这样使用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);