我需要用类似的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);