Я бы рекомендовал либо хранить как целое число минут, либо как пользовательское поле «время», которое автоматически создавало бы объект значения «Время», который давал бы вам доступ к нужным вам методам. Объект значения будет немного сложнее.
Преимущество хранения в виде минут заключается в том, что вы можете выполнять поиск, связанный с математикой (SUM
, AVG
и т. д.), напрямую, вместо того, чтобы вызывать каждый объект по отдельности и добавлять их таким образом.
Помимо использования целочисленного метода, вы можете создать тот же объект значения «Время», который занял время в минутах, а затем получить его из вашего объекта, например..
/**
* 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()
(после проверки времени не равно нулю или, альтернативно, возвращая пустой объект Time).
29.07.2015