教义子查询和其他地方

时间:2018-01-26 12:19:30

标签: mysql symfony doctrine-orm doctrine

我正在建立一个使用Doctrine的if和where条件的大型过滤器。

粗略的想法看起来像这样:

$qb = $this->getEntityManager()->createQueryBuilder();

$qb->select(...)->from(...)->joins(...)

if ($params['param1']) {
  $qb->where(...)
}

if ($params['param2']) {
  $qb->andWhere(...)
}

if ($params['param3']) {
  $qb->andWhere(...)
}

我遇到的问题是我需要使用带有“orWhere”的“andWhere”,但我只想让“orWhere”与这个单独的“andWhere”进行比较,而不是我构建的整个查询起来。

所以它看起来像这样:

if ($params['param4']) {
  $qb->andWhere(...)
    ->orWhere(...)
}

如果我做这样的事情,那么一旦我使用orWhere,它将忽略param1,param2,param3的所有内容,当我想要的是它将自己与param4s中的条件进行比较。

我认为我需要使用子查询,但我真的很遗憾在Doctrine中如何做到这一点。有人能指出我如何实现这个目标吗?

1 个答案:

答案 0 :(得分:4)

对于这种情况,您可以依赖Expr类,其中包含构建更复杂查询所需的方法。您需要了解的所有内容都在the Query Builder section中的Doctrine文档中进行了解释。

当前的文档实际上给出了一个几乎与您提到的用例相符的示例。你可以写这样的东西,例如:

$qb->andWhere($qb->expr()->orX(
   $qb->expr()->eq('u.id', '?1'),
   $qb->expr()->like('u.nickname', '?2')
));

依赖Expr类的主要优点是,您几乎可以编写任何类型的组合,它将为它生成正确的DQL。然而,它可能会变得非常冗长。

话虽如此,您也可以直接在andWhere

中写下您的OR条件
$qb->andWhere('u.id = ?1 OR u.nickname = ?2');