Symfony2 Doctrine查询 - 添加日期时间

时间:2015-09-22 22:04:17

标签: php mysql symfony doctrine-orm doctrine

我目前面临一个小问题:我有一个事件表,并希望了解即将发生或正在进行的事件。

因此,例如我们在星期一中午12点,我们计划今天举办3场活动:

  • 活动A从10:00开始,持续1h

  • 活动B从11:00开始,持续2h

  • 活动C从13:00开始,持续2h

最后,我想得到事件B(正在进行)和事件C(即将到来)。

我尝试过这样做(没有工作):

public function findAllPast(\Datetime $datetime) 
{
    $query = $this->createQueryBuilder('event')
        ->where('event.startTime + event.duration >= :time')
        ->setParameter('time', $datetime)
        ->getQuery();

    return $query->getResult();    
}

搜索一下,我进入了SQL ADDTIME()函数。我非常想做一个地方(' ADDTIME(event.startTime,event.duration)> =:time'),但这不是Doctrine认可的。

在没有残酷的原生SQL的情况下,有没有正确的方法呢?

2 个答案:

答案 0 :(得分:0)

您可以使用Doctrine的DATE_ADD()功能:

public function findAllPast(\Datetime $datetime) 
{
    $query = $this->createQueryBuilder('event')
        ->where('DATE_ADD(event.startTime, event.duration, "days") >= :time')
        ->setParameter('time', $datetime)
        ->getQuery();

    return $query->getResult();    
}

这假设event.duration当然是几天。

编辑:使用DateTime个对象的PHP的替代方法

如果$duration以秒为单位,您可以简单地:

$datetime->sub(new DateInterval('PT' . $durationInSeconds . 'S')); // or ->add(), depending on what you wnat

然后只使用:

public function findAllPast(\Datetime $datetime) 
{

    $datetime->sub(new DateInterval('PT' . $durationInSeconds . 'S'));

    $query = $this->createQueryBuilder('event')
        ->where('event.startTime >= :time')
        ->setParameter('time', $datetime)
        ->getQuery();

    return $query->getResult();    
}

答案 1 :(得分:0)

好的,这是一个工作解决方案,其中$ duration作为时间字段(对于问题的表单部分来说简单得多):自定义查询

   $entityManager = $this->getEntityManager();

    $rsm = new ResultSetMappingBuilder($entityManager);
    $rsm->addRootEntityFromClassMetadata('Ormindo\EventBundle\Entity\Event', 'event');

    $sql = " 
    SELECT *
      FROM events
      WHERE ADDTIME(startTime, duration) > '" . $datetime->format("Y-m-d H:i:s") ."'"
    ;

    $query = $entityManager->createNativeQuery($sql, $rsm);

    return $query->getResult();

不要忘记使用

use Doctrine\ORM\Query\ResultSetMappingBuilder;

谢谢你的时间和快速回复:)