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

Bar*_*cki 34 php oop doctrine dql doctrine-orm

我需要用QueryBuilder这样的方法构造DQL

[QUERY]... AND WHERE e.type = x OR e.type = Y OR e.type = N [...]
Run Code Online (Sandbox Code Playgroud)

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

$qb->andWhere($qb->expr()->orx(CONDITIONS));
Run Code Online (Sandbox Code Playgroud)

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

DEY*_*DEY 67

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

$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);
Run Code Online (Sandbox Code Playgroud)

使用@meze建议,您可以简化代码并将foreach语句替换为:

$orX->addMultiple($conditions);
Run Code Online (Sandbox Code Playgroud)

  • 每天都比以前更好,foreach可以替换为`$或X-> addMultiple($ conditions);` (19认同)
  • 我已经更改了社区维基的答案。@meze,欢迎您对其进行更改。 (2认同)

Bar*_*cki 12

我知道tommarow会是一个更美好的一天.解决方案很简单.你可以像这样制作一些OR表达式

$ors[] = $qb->expr()->orx('e.type = '.$qb->expr()->literal($value));
Run Code Online (Sandbox Code Playgroud)

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

$qb->andWhere(join(' OR ', $ors));
Run Code Online (Sandbox Code Playgroud)


Wil*_*ilt 11

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

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

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

$qb->where($orX);
Run Code Online (Sandbox Code Playgroud)


Kar*_*ica 9

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

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