我正在建立一个使用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中如何做到这一点。有人能指出我如何实现这个目标吗?
答案 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
:
$qb->andWhere('u.id = ?1 OR u.nickname = ?2');