我正在记录人们工作的小时和分钟,然后将它们加在一起以产生一段时间内工作的总量。在Doctrine中使用的最佳列类型是什么?我最初的想法只是使用整数,但这需要来回转换为时间格式。
这些时间计算的最佳做法是什么?
答案 0 :(得分:1)
我认为对你而言需要使用“datetime”类型提交。您可以转换不同格式的DateTime对象
/**
* @var \DateTime $start
*
* @ORM\Column(type="datetime")
*/
protected $start;
/**
* @var \DateTime $end
*
* @ORM\Column(type="datetime")
*/
protected $end;
/**
* @return \DateTime
*/
public function getStart()
{
return $this->start;
}
/**
* @param \DateTime $start
*/
public function setStart(\DateTime $start)
{
$this->start = $start;
}
/**
* @return \DateTime
*/
public function getEnd()
{
return $this->end;
}
/**
* @param \DateTime $end
*/
public function setEnd(\DateTime $end)
{
$this->end = $end;
}
答案 1 :(得分:1)
我建议将其存储为分钟整数或自定义“时间”字段,该字段将自动创建“时间”值对象,以便您访问所需的方法。值对象会有点复杂。
作为分钟存储的好处是你可以直接进行与数学相关的搜索(SUM
,AVG
等),而不必单独调用每个对象并以这种方式添加它们。 / p>
除了使用整数方法之外,您还可以创建相同的“时间”值对象,该对象花费时间以分钟为单位,然后从您的对象中获取该对象,如...
/**
* Get minutes worked
*
* @return integer
*/
public function getMinutes()
{
return $minutes;
}
/**
* Set working minutes
*
* @param integer $minutes
* @return $this
*/
public functions setMinutes($minutes)
{
$this->minutes = $minutes
return $this;
}
/**
* Get worked Time
*
* @return Time
*/
public function getTime()
{
if (null === $this->minutes) {
return $minutes;
// Or return Time::fromMinutes(0);
}
return Time::fromMinutes($this->minutes);
}
然后在你的价值对象中..
class Time
{
private $minutes;
/**
* Private constructor so as to use more meaningful static calls
*
* @param integer $minutes
*/
private function __construct($minutes)
{
if ($is_int($minutes)) {
throw new \Exception(sprintf(
'Minutes expected to be an "integer", "%s" given',
gettype($minutes)
));
}
$this->minutes = $minutes;
}
/**
* Construct object from minutes
*
* @param integer $minutes
* @return Time
*/
public static function fromMinutes($minutes)
{
return self($minutes);
}
/**
* Get time in minutes
*
* @return integer
*/
public function getMinutes()
{
return $this->minutes;
}
/**
* Get time in hours and minutes string in 00:00 format
*
* @return string
*/
public function getAsString()
{
return sprintf(
'%02d:%02d',
floor($this->minutes / 60),
$this->minutes % 60
);
}
//...
Any other methods
}
所以你的表单可能只需要几分钟(或带有数据转换器的00:00字符串),然后你可以像$job->getTime()->getAsString()
一样调用它(在检查时间不是null之后,或者返回一个空的时间)对象)。