12

我不知道哪种是在数据库中存储时间戳的最佳方式。我想用小时分钟和秒存储整个日期,但它只存储日期(例如 2012-07-14),我想存储 2012-07-14 HH:MM:SS。我正在使用 dateTime 对象。这是代码:

在控制器中:

$user->setCreated(new \DateTime());

在实体中:

/**
 * @var date $created
 *
 * @ORM\Column(name="created", type="date")
 */
private $created;

将日期和时间分别存储在数据库中会更好吗?还是更好地像 YYYY-MM-DD HH:MM:SS 一样存储在一起?然后我将不得不比较日期并计算剩余时间,这对于简化以后的操作很重要。所以你怎么看 ?有人可以帮助我吗?

4

4 回答 4

12

如果您的数据库支持该类型,那么在数据库中存储时间戳的最佳方式显然是使用时间戳列。而且由于您可以将该列设置为在创建时自动更新,因此您甚至不必为其提供设置器。

有一个适用于 Doctrine 2 的 Timestampable 行为扩展,它也可以从用户端实现这一点:

时间戳行为将自动更新您的实体或文档上的日期字段。它通过注释工作,可以在创建、更新甚至特定属性值更改时更新字段。

特征:

  • 在创建、更新甚至记录属性更改时自动更新预定义日期字段
  • ORM 和 ODM 支持使用相同的侦听器
  • 属性的具体注解,无需接口
  • 可以对特定属性或对特定值的关系变化做出反应
  • 可以与其他行为嵌套
  • 对扩展的注解、Yaml 和 Xml 映射支持

有了这种行为,您需要做的就是将您的注释更改为

/**
 * @var datetime $created
 *
 * @Gedmo\Timestampable(on="create")
 * @ORM\Column(type="datetime")
 */
private $created;

然后你不需要调用setCreated你的代码。首次创建实体时将自动设置该字段。

于 2012-07-16T13:32:40.930 回答
11

为了在不使用 Timestampable 行为原则的情况下存储创建日期,您还可以使用LifeCycle Callbacks@ORM\HasLifecycleCallbacks ,方法是在声明类时添加注释。这是在您的情况下将YYYY-MM-DD HH:MM:SS存储在数据库中的方法。

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="yourTable")
 */
class Nasy
{

    /**
    * @ORM\Column(name="created", type="string", length=255)
    */

    private $created;
    /**
     * @ORM\PrePersist
     */
    public function doStuffOnPrePersist()
    {
        $this->created = date('Y-m-d H:i:s');
    }

最后,如果您遇到时区问题,您可以在登录时使用事件侦听器在会话中设置时区。Matt Drolette 在他的博客上做了很棒的工作。无论如何,您可能总是将时间存储在服务器所在的时区中。然后使用会话中设置的时区向用户显示正确的时间。祝你好运。

于 2012-07-24T13:36:58.997 回答
5

基于@Pratt 的回答,我做到了这一点。我的实体中有 2 个字段,一个用于创建,一个用于修改。

/**
* @ORM\Column(type="datetime")
 */
protected $created_at;

/**
* @ORM\Column(type="datetime")
 */
protected $modified_at;

然后使用注释我在 prePersist 和 preUpdate 上调用它

/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function updatedTimestamps()
{
    $this->setModifiedAt(new \DateTime(date('Y-m-d H:i:s')));

    if($this->getCreatedAt() == null)
    {
        $this->setCreatedAt(new \DateTime(date('Y-m-d H:i:s')));
    }
}

该功能可以分为 2 个功能,一个用于创建一个用于更新,但这是有效的,所以当它正常工作时,我认为没有理由额外的代码。

于 2012-10-31T14:05:09.283 回答
4

您可以像这样使用@Version:

/**
 * @var date $created
 *
 * @ORM\Column(name="created", type="datetime")
 * @ORM\Version
 */
private $created;

这仅适用于日期时间类型。

于 2014-03-18T17:29:51.503 回答