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

时间:2012-07-28 20:34:30

标签: php oop doctrine-orm doctrine dql

我需要用这样的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 AND WHERE不再有OR。
我可以存储多个orx表达式,然后将其添加到andWhere吗?任何想法如何解决,可能是常见问题?

5 个答案:

答案 0 :(得分:61)

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

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

答案 1 :(得分:9)

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

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

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

$qb->where($orX);

答案 2 :(得分:8)

我知道tommarow会过得更好。 解决方案很简单。你可以制作像这样的OR表达式

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

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

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

答案 3 :(得分:2)

你也可以在php中使用...

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

答案 4 :(得分:1)

您还可以使用call_user_func_array函数like this

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