如何在Doctrine2 Query Builder中使用'interval'

med*_*kch 9 php postgresql query-builder symfony doctrine-orm

在我的Symfony2存储库中,我想从调度表中获取已经启动但尚未完成的对象.对象内的区间应该是"未完成",应该作为变量传递.

使用纯SQL,它的工作方式如下:

SELECT * FROM slots rbs 
  WHERE rbs.rundate = '2012-08-13' 
  AND rbs.runtime <= '11:05:00' 
  AND '11:05:00' <= rbs.runtime + interval '300 seconds'
  ORDER BY rbs.rundate DESC, rbs.runtime DESC
Run Code Online (Sandbox Code Playgroud)

我可以使用DQL/Query Builder实现相同的功能吗?

这是我到目前为止:

$qb = $this->createQueryBuilder('rbs');
$qb->where(
    $qb->expr()->andX(
         $qb->expr()->eq('rbs.rundate', ':date'),
         $qb->expr()->lte('rbs.runtime', ':time'),
         'rbs.runtime + interval 300 seconds >= :time'
        )
    )
  ->orderBy('rbs.rundate', 'DESC')
  ->addOrderBy('rbs.runtime', 'DESC')
  ->setParameter('date', date('Y-m-d'))
  ->setParameter('time', date('H:i:s'))
Run Code Online (Sandbox Code Playgroud)

但是这会返回以下错误:

[Doctrine\ORM\Query\QueryException]                                                 
[Syntax Error] line 0, col 139: Error: Expected =, <, <=, <>, >, >=, !=, got '300'
Run Code Online (Sandbox Code Playgroud)

我发现Doctrine2/DQL 不支持'interval',这也在这里提到.

有关如何使用Doctrine2的Query Builder或DQL(并将间隔作为变量传递)的任何建议?

gui*_*ier 17

据我所知,Interval没有移植到Doctrine中.我找到的解决方法是直接在DateTime上作为参数传递(这里,我想使用2天的间隔,通过Datetime):

public function findOngoingPublicEvents()
{
    return $this->createQueryBuilder('e')
        ->where('e.isActive = 1')
        ->andWhere('e.isPublic = 1')
        ->andWhere('e.begin <= :begin')
        ->andWhere('e.end >= :end')
        ->orderBy('e.id', 'ASC')
        ->setParameter('begin', new \DateTime('+2 days'))
        ->setParameter('end', new \DateTime('-2 days'))
        ->getQuery()
        ->execute();
}
Run Code Online (Sandbox Code Playgroud)

  • 有用.使用列中的值作为时间偏移怎么样?像` - > setParameter('begin',new\DateTime('+ e.timeOffset days'))`.我怎样才能做到这一点? (5认同)

Kir*_*ran 7

如果您想在 mysql comumn 字段上使用 INTERVAL(在 Doctrine 2,DQL 中),您可以使用如下,

$qb->andWhere("DATE_ADD(pv.myDAte,48,'hour') >= UTC_TIMESTAMP()");
Run Code Online (Sandbox Code Playgroud)

它将打印如下 SQL,

...... DATE_ADD(p0_.appointment_date, INTERVAL 48 HOUR) >= UTC_TIMESTAMP() .....
Run Code Online (Sandbox Code Playgroud)


Ser*_*pov 5

@Kiran 只写 about DATE_ADD,但你也可以使用DATE_SUB

$qb->andWhere("DATE(a2_.updatedAt) = DATE_SUB(CURRENT_DATE(), 6, 'day')");
Run Code Online (Sandbox Code Playgroud)

它相当于 SQL:

DATE(a2_.updatedAt) = DATE_SUB(CURRENT_DATE, INTERVAL 6 DAY)
Run Code Online (Sandbox Code Playgroud)