Doctrine 如何使用条令定义yaml中的当前时间戳?

Doctrine 如何使用条令定义yaml中的当前时间戳?,doctrine,timestamp,yaml,Doctrine,Timestamp,Yaml,我尝试了以下yaml代码: columns: created_time: type: timestamp notnull: true default: default CURRENT_TIMESTAMP 在输出的sql语句中,字段被视为datetime而不是timestamp,我无法在其中定义当前时间戳 如果我坚持使用时间戳来存储当前时间,如何在yaml中这样做?您可以使用条令中的“时间戳”功能,例如: actAs: Timestampable: cre

我尝试了以下yaml代码:

columns:
  created_time:
    type: timestamp
    notnull: true
    default: default CURRENT_TIMESTAMP
在输出的sql语句中,字段被视为datetime而不是timestamp,我无法在其中定义当前时间戳


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

您可以使用条令中的“时间戳”功能,例如:

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

请注意,
defaultcurrent\u TIMESTAMP
的工作原理与timestable不同,因此不能盲目地将一个替换为另一个

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

  • 此外,表定义中的
    默认当前\u时间戳
    使得数据库模型IMHO更加一致,因为无论您如何插入数据(例如,在DB engine命令行上运行
    insert
    s),您都会在列上获得当前日期/时间

顺便说一句,我还在寻找第一个问题中提到的当前时间戳问题的答案,因为这是(由于上述原因)我保留“时间戳”列的首选方式。

您可以使用:

default: '<?php echo date('Y-m-d H:i:s') ?>'
默认值:“”

如果为了使用MySQL的自动初始化时间戳(请参阅),您愿意牺牲一些可移植性(请参阅),那么您可以使用以下功能:

亚马尔:

注释:

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

运行后
/vendor/bin/doctrine模块orm:schema工具:更新--force

正在更新数据库架构。。。数据库架构更新成功!"1" 执行了查询

并运行
/vendor/bin/doctrine模块orm:validate schema

[映射]确定-映射文件正确。[Database]失败-错误 数据库架构与当前映射文件不同步

但是同步出现失败

很抱歉发布。 但我也遇到了同样的问题。条令2和postgreSql都有解决方案。我使用了Gemdo扩展并添加了以下字符串:

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

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

转储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;

我建议根本不要对时间戳使用
“default”

它将在应用程序中的yaml中带来不可预测的状态。 此视频()提供了有关此主题的更多信息。 我建议您仔细检查并创建一个命名构造函数

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

我建议无国籍,祝你好运

你好,j0k,谢谢你的回答。因为我无法让它与您的解决方案配合使用,所以创建了一个新主题:警告!这是一个很好的答案,当您不想从PHP更新您的数据库,但确实想用迁移之类的方式更新结构时!
created:
    type: date
    options:
        default: 0
        nullable: true
    gedmo:
        timestampable:
            on: create
updated:
    type: datetime
    options:
         default: 0
         nullable: true
    gedmo:
         timestampable:
             on: update
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;
public function createTimestamp(string $priority, int $priorityNormalized)
{
    $this->priority = $priority;
    $this->priorityNormalized = $priorityNormalized;
}