Doctrine 中是否有正确的方法来嵌套“OR”where 子句?

开发时间

我有一个查询,如果它们有结束日期并且未完成而产生所需的结果,则会引入一些作业:

真实代码

$this->createQueryBuilder('j')
                ->where('j.completed = :false OR j.completed is NULL')
                ->andWhere('j.has_due_date = :true')
                ->andWhere('j.has_due_date = :true')
                ->setParameters( array(
                    'false' => FALSE,
                    'true' => TRUE
                ) )
                ->orderBy('j.due_date', 'asc')
                ->getQuery();

结果

SELECT j FROM App\Entity\Jobs j 
    WHERE (
        j.completed = :false 
        OR j.completed is NULL
    ) 
    AND j.has_due_date = :true 
    ORDER BY j.due_date ASC

我想为此遵循 DQL 最佳实践,并且感觉有另一种方法或编写此方法,并且WHERE每次调用->where变体时只有一个子句( andWhere(), orWhere())

在我看来,它是这样的,但我找不到任何东西来确认它:

伪代码

$query = $this->createQueryBuilder('j')
                  ->where( $requiredClass->
                                ->where('j.completed = :false')
                                ->orWhere('j.completed is NULL')
                                ->setParameter('false', FALSE) 
                  )
                  ->andWhere('j.has_due_date = :true')
                  ->setParameter('true', TRUE) 
                  ->orderBy('j.due_date', 'asc')
                  ->getQuery();

主要问题是:

  • 有没有办法做到这一点的第二种方式?
  • 我是不是把事情不必要地复杂化了?
  • 如果如上所述有第二种方法可以做到这一点,则第一个语句有效,那么为什么重要呢?
Łukasz Jakubek

正如QueryBuilder最佳实践的官方文档中所述- 正确的方法是使用 helper 方法QueryBuilder::expr()Doctrine\ORM\Query\Exprhelper 类。高级 API 方法

IE:

// create QueryBuilder
$qb = $this->createQueryBuilder('j');

// build conditions
$qb->where(
    $qb->expr()->orX(
        $qb->expr()->eq('j.completed', ':false'),
        $qb->expr()->isNull('j.completed')
    )
)
->andWhere(
    $qb->expr()->eq('j.has_due_date', ':true')
)
->andWhere(
    $qb->expr()->eq('j.has_due_date', ':true')
)
->setParameters(array(
    'false' => FALSE,
    'true' => TRUE
))
->orderBy('j.due_date', 'asc');

// get query
$query = $qb->getQuery();

// execute and get result
$result = $query->getResult();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章