我目前面临一个小问题:我有一个事件表,并希望了解即将发生或正在进行的事件。
因此,例如我们在星期一中午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的情况下,有没有正确的方法呢?
答案 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;
谢谢你的时间和快速回复:)