2010-05-30 1038 views
13

我尝试以下YAML代码:如何在教条中定义yaml中的当前时间戳?

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

在输出sql语句,字段被视为日期时间,而不是时间戳,我在那里不能确定当前的时间戳...

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

回答

9

你可以在教义使用“Timestampable”的功能,如:

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

注意DEFAULT CURRENT_TIMESTAMP不起作用一样Timestampable,这样的话你不能盲目换一个其他的。

  • 首先,前者使用了DB服务器的日期/时间,而后者采用的是学说魔力,在你的web服务器调用PHP的date()函数。换句话说,它们是从两个完全不同的时钟源获取日期/时间的两种截然不同的方式。如果您使用Timestampable,您的Web服务器运行在与您的数据库服务器不同的计算机上,并且您不会使用例如“ NTP。

  • 此外,DEFAULT CURRENT_TIMESTAMP正对表定义使得一个更加一致的数据库模型恕我直言,因为无论你怎么插入的数据(例如,数据库引擎的命令行中运行INSERT S),你会始终在列上获取当前日期/时间。

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

+0

这里是我的解决方案:http://stackoverflow.com/a/37924640/1668200 – 2016-06-20 14:11:46

-12

您可以使用:

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

如果你愿意牺牲一些便携性(见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") 
+0

嗨j0k,谢谢你的回答。由于我无法让它与您的解决方案一起工作,所以提出了一个新的话题:http://stackoverflow.com/questions/17208388/symfony-1-4-doctrine-1-yalm-cannot-define-default-timestamp-value – xtrm 2013-06-20 08:07:55

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

[映射] OK - 映射文件是正确的。[数据库]失败 - 数据库架构与当前映射文件不同步。

失败用于同步出现

+0

警告!这是很好的答案,当你不会从PHP更新你的数据库时,但是确实需要使用迁移等更新结构! – 2015-03-30 11:51:48

0

对不起necroposting。 但我遇到同样的问题。有教条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; 
1

我建议不要使用"default"的时间戳的。

它会在你的应用程序中带来不可预测的状态。 此视频(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; 
} 

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