如何使用doctrine定义yaml中的当前时间戳?

时间:2010-05-30 12:42:40

标签: doctrine timestamp yaml

我尝试了以下yaml代码:

columns:
  created_time:
    type: timestamp
    notnull: true
    default: default CURRENT_TIMESTAMP

在输出的sql语句中,该字段被视为datetime而不是timestamp,我无法在其中定义当前时间戳...

如果我坚持使用时间戳来存储当前时间,那么如何在yaml中这样做?

7 个答案:

答案 0 :(得分:17)

如果您愿意牺牲一些可移植性(参见description of columnDefinition attribute)来使用MySQL的自动初始化TIMESTAMP(参见MySQL timestamp initialization),那么您可以使用以下内容:

YAML:

  created_time:
    type: datetime
    columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP

注释:

@ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")

答案 1 :(得分:13)

请注意DEFAULT CURRENT_TIMESTAMP与Timestampable的工作方式不同,因此您不能盲目地将其中一个交换为另一个。

  • 首先,前者使用数据库服务器的日期/时间,而后者使用在Web服务器上调用PHP的date()函数的Doctrine魔术。换句话说,它们是从两个完全不同的时钟源获取日期/时间的两种不同方式。如果您使用Timestampable,您可能会遇到大麻烦,您的Web服务器在与数据库服务器不同的机器上运行,并且您不会使用例如时钟保持时钟同步。 NTP。

  • 此外,表定义中的DEFAULT CURRENT_TIMESTAMP使得数据库模型更加一致IMHO,无论您如何插入数据(例如,在{}上运行INSERT数据库引擎命令行),您将始终获得列上的当前日期/时间。

顺便说一句,我也在寻找初始问题中提到的CURRENT_TIMESTAMP问题的答案,因为这是(由于上面列出的原因)我保留“时间戳”列的首选方法。

答案 2 :(得分:11)

您可以在学说中使用“Timestampable”功能,例如:

actAs:
  Timestampable:
    created:
      name: created_time
    updated:
      disabled: true
columns:
  created_time:
    type: timestamp
   notnull: true

答案 3 :(得分:0)

/**
 * @var int
 * @ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
 */
protected $created;

运行./vendor/bin/doctrine-module orm:schema-tool:update --force

之后
  

更新数据库架构...数据库架构已成功更新! “1”   查询已执行

并运行./vendor/bin/doctrine-module orm:validate-schema

  

[Mapping] OK - 映射文件正确。 [数据库]失败 -   数据库模式与当前映射文件不同步。

但是失败用于同步

答案 4 :(得分:0)

抱歉为尸检。 但我也遇到了同样的问题。有doctrine 2和postgreSql的解决方案。我使用了Gemdo扩展并添加了以下字符串:

 $evm = new \Doctrine\Common\EventManager();

        $timestampableListener = new \Gedmo\Timestampable\TimestampableListener;
        $timestampableListener->setAnnotationReader($cachedAnnotationReader);
        $evm->addEventSubscriber($timestampableListener);

YAML:

created:
    type: date
    options:
        default: 0
        nullable: true
    gedmo:
        timestampable:
            on: create
updated:
    type: datetime
    options:
         default: 0
         nullable: true
    gedmo:
         timestampable:
             on: update

转储-SQL:

ALTER TABLE users ADD created DATE DEFAULT CURRENT_DATE NOT NULL;
ALTER TABLE users ADD updated TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL;

答案 5 :(得分:0)

我建议不要将"default"用于时间戳。

它将在您的应用程序中为yaml带来不可预测的状态。 此视频(PHP UK Conference 2016 - Marco Pivetta - Doctrine ORM Good Practices and Tricks)提供了有关此主题的更多信息。 我建议你去完成它并创建一个命名的构造函数。

public function createTimestamp(string $priority, int $priorityNormalized)
{
    $this->priority = $priority;
    $this->priorityNormalized = $priorityNormalized;
}

我建议无国籍,祝你好运!

答案 6 :(得分:-13)

您可以使用:

default: '<?php echo date('Y-m-d H:i:s') ?>'