如何使用Doctrine ODM存储持续时间

时间:2015-07-15 17:14:01

标签: php doctrine-odm

我存储了代表具有学说的事件的文件。每个$event都有一个$eventType。每个$eventType都有$duration

对于每个$event,我只会存储$begin但不会存储,因为它可以使用$duration的默认$eventType进行计算。

使用每种eventType存储持续时间的最佳方式是什么?

  1. 如果它存在于学说中,我会选择 DateInterval 注释。但事实并非如此。
  2. 将持续时间的秒数保存为整数?
  3. 还有其他可能吗?
  4. 简化的eventType模型如下所示

    <?php
    
     /**
      * Class EventType
      * @ODM\Document(collection="EventType")
      */
     class EventType {
    
         /**
          * @var $duration int
          * @ODM\Int
          */
         private $duration;
    }
    

1 个答案:

答案 0 :(得分:1)

如您所述,您可以以秒为单位保存持续时间。 拥有一个getEnd方法非常简单:

/**
* return \DateTime
*/
public function getEnd()
{
  $end = clone $this->begin;
  return $end->add(new DateInterval('PT' . $this->duration . 'S'));
}

或者你可以存储$ end日期,而不是你也可以计算的持续时间:

/**
* return \DateInterval
*/
public function getDuration() 
{
  return $begin->diff($end);
}

日期差异的棘手问题是夏令时:有时你可以

date + 3600seconds == date + 2*3600seconds

因此,您应该考虑将为结束日期提出何种类型的查询:您将选择持续(多于或少于)给定时间的事件,还是选择结束(之前/之后/之后)的事件给定日期?

第二个选项更常见,所以我会存储结束日期。