Doctrine,symfony2正确的列类型用于计算小时数

时间:2015-07-29 08:01:36

标签: php mysql database symfony doctrine-orm

我正在记录人们工作的小时和分钟,然后将它们加在一起以产生一段时间内工作的总量。在Doctrine中使用的最佳列类型是什么?我最初的想法只是使用整数,但这需要来回转换为时间格式。

这些时间计算的最佳做法是什么?

2 个答案:

答案 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)

我建议将其存储为分钟整数或自定义“时间”字段,该字段将自动创建“时间”值对象,以便您访问所需的方法。值对象会有点复杂。

作为分钟存储的好处是你可以直接进行与数学相关的搜索(SUMAVG等),而不必单独调用每个对象并以这种方式添加它们。 / 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之后,或者返回一个空的时间)对象)。