如何在教条中定义yaml中的当前时间戳?
我尝试以下YAML代码:如何在教条中定义yaml中的当前时间戳?
columns:
created_time:
type: timestamp
notnull: true
default: default CURRENT_TIMESTAMP
在输出sql语句,字段被视为日期时间,而不是时间戳,我在那里不能确定当前的时间戳...
如果我坚持用时间戳来存储当前时间,如何在yaml中这样做?
你可以在教义使用“Timestampable”的功能,如:
actAs:
Timestampable:
created:
name: created_time
updated:
disabled: true
columns:
created_time:
type: timestamp
notnull: true
注意DEFAULT CURRENT_TIMESTAMP
不起作用一样Timestampable,这样的话你不能盲目换一个其他的。
首先,前者使用了DB服务器的日期/时间,而后者采用的是学说魔力,在你的web服务器调用PHP的date()函数。换句话说,它们是从两个完全不同的时钟源获取日期/时间的两种截然不同的方式。如果您使用Timestampable,您的Web服务器运行在与您的数据库服务器不同的计算机上,并且您不会使用例如“ NTP。
此外,
DEFAULT CURRENT_TIMESTAMP
正对表定义使得一个更加一致的数据库模型恕我直言,因为无论你怎么插入的数据(例如,数据库引擎的命令行中运行INSERT
S),你会始终在列上获取当前日期/时间。
顺便说一句,我也在寻找一个答案在最初的问题中提到的CURRENT_TIMESTAMP
问题,因为这是(由于上述原因),我的首选保持“时间戳”列的方式。
您可以使用:
default: '<?php echo date('Y-m-d H:i:s') ?>'
如果你愿意牺牲一些便携性(见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")
嗨j0k,谢谢你的回答。由于我无法让它与您的解决方案一起工作,所以提出了一个新的话题:http://stackoverflow.com/questions/17208388/symfony-1-4-doctrine-1-yalm-cannot-define-default-timestamp-value – xtrm 2013-06-20 08:07:55
/**
* @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 - 映射文件是正确的。[数据库]失败 - 数据库架构与当前映射文件不同步。
但失败用于同步出现
警告!这是很好的答案,当你不会从PHP更新你的数据库时,但是确实需要使用迁移等更新结构! – 2015-03-30 11:51:48
对不起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;
我建议不要使用"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;
}
我建议是无国籍的,祝你好运!
这里是我的解决方案:http://stackoverflow.com/a/37924640/1668200 – 2016-06-20 14:11:46