php doctrine datetime,关于php:Doctrine 2.1 – datetime列的默认值

有人能告诉我如何在datetime列上添加默认值吗?我不能这样做:

protected $registration_date = date("Y-m-d H:i:s", time());

那怎么办?

对于默认值,当前时间戳:

@ORM\Column(name="created_at", type="datetime", options={"default":"CURRENT_TIMESTAMP"})

或者对于旧的symfony版本:

@ORM\Column(name="created_at", type="datetime", options={"default": 0})

为我工作…但是,这只适用于MySQL。

这应该是现在IMO的首要答案,特别是如果您希望表模式本身假定当前的时间戳

谢谢。这对我有很大帮助。我以前用过options={"default":"CURRENT_TIMESTAMP"}),一般也很管用。但是在我的postgres数据库后面,它被转换为default now(),这就是postgres的方法。但是随后一个原则:migrations:diff会将now()错误地解释为与当前时间戳的偏差,并在每次运行它时创建一个diff文件。但有了这个解决方案,所有的事情都是同步的。

很好的答案,而且,在我看来,这是最干净的方法。如果有兴趣的话,我把它翻译成ADD date_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL。

顺便提一句,如果服务器上没有启用"零日期dev.mysql.com/doc/refman/5.7/en/&hellip",这将不起作用。参见dev.mysql.com/doc/refman/5.7/en/timestamp initialization.htm‌&8203;l中的注释

值得一提的是,这只适用于下面的mysql>=5.6.5,mysql不支持将当前的时间戳设置为datetime列的默认值。见stackoverflow.com/a/168832/4735939

这不适用于mysql:5.7 SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'date_create'。

不适用于PostgreSQL(9.6.6),因为它抛出:SQLSTATE[22008]: Datetime field overflow: 7 ERROR: date/time field value out of range:"0"。

这在2014年确实不是一个坏主意,但在2018年,生命周期回调是一个不错的选择。另外,这不再适用于PostgreSQL。

不适用于Oracle DB 12.1和"条令/ORM"2.6.1,创建代码为DEFAULT '0'的迁移。出现错误:ORA-01840:输入值对于日期格式不够长。对我来说,答案是可行的@d.samchuk * @ORM \ Column (type ="datetime", options = {"default" ="CURRENT_TIMESTAMP"})

它既不适用于2.6原则,也不适用于Mariadb,我假设是MySQL。github.com/district/orm/issues/6346号

如果希望非常精确,还可以使用生命周期回调:

use Doctrine\ORM\Mapping as ORM;

/**

* @ORM\HasLifecycleCallbacks

* ...

*/

class MyEntity

{

/**

* @ORM\PrePersist

*/

public function onPrePersistSetRegistrationDate()

{

$this->registration_date = new \DateTime();

}

}

我更喜欢这个答案,因为它使人们更清楚地知道,教义将如何处理它。

+1将在记录中记录最新日期。如果记录有两个日期,则修改"日期时间"并创建"日期时间"。如果将修改后的u日期时间放入构造函数,则创建的u时间可能比修改后的u日期时间新。

参考生命周期回调的所有功能:distrine orm.readthedocs.org/en/latest/reference/…

将属性映射为日期时间类型,然后使用新的日期时间实例在构造函数中设置值:

/**

* @Entity

* @Table(name="...")

*/

class MyEntity

{

/** @Column(type="datetime") */

protected $registration_date;

public function __construct()

{

$this->registration_date = new DateTime();

}

}

它作为持久类的构造函数工作,不会在水合时调用。

我投票赞成这个答案,因为它是纯PHP解决方案。其他答案可能是:1)需要专门知识onPrePersistSetRegistrationDate添加HasLifecycleCallbacks和PrePersist注释2)我想设置一个默认值需要我添加第三个库@Gedmo\Timestampable吗?!!!3)当前时间戳有时不好。例如:当您的脚本服务器在中国,而数据库服务器在美国时。(有原因的,不是很常见,但也有这样的情况)

这有一个自动的扩展…

https://github.com/l3p4rd/doctrineextensions/blob/master/doc/timestampable.md网站

/**

* @var \DateTime

*

* @ORM\Column(name="date_added", type="datetime")

* @Gedmo\Timestampable(on="create")

*/

private $date_added;

/**

* @var \DateTime

*

* @ORM\Column(name="date_modified", type="datetime")

* @Gedmo\Timestampable(on="update")

*/

private $date_modified;

这需要提高投票率,因为这肯定是最好的方法。

@SC0TTY如果基本功能可以达到完全相同的目标,为什么要使用扩展?

不知道-不要再使用PHP了,这是3年前的事了:-)

@确保数据库兼容性的luba是一个想法。如果一个数据库不处理将默认值设置为0并将其映射到当前时间戳,或者不理解当前时间戳,该怎么办?

我认为,为datetime完成自动填充的最佳方法是这样:

* @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"})

将逻辑放入构造函数不是正确的解决方案,因为设置默认值是SQL客户端的责任。如果您决定不再使用ORM,您将失去业务逻辑。另外,如果使用构造函数,您将无法向现有行的datetime属性添加默认时间戳。

谢谢:D最佳答案

这在条令2.5中不起作用。

如下文所述,"default": 0更适用于学说迁移。

@var string @ORM\Column(name="login_at", type="datetime", options={"default" ="CURRENT_TIMESTAMP"})

这是可行的。只是为了将来的参考。

这不起作用:违反完整性约束:1048列的"登录位置"不能为空

@如果您没有该表的任何数据,上述方法将有效。意味着如果已经有了列,则必须为每行向该列添加一些值。或者,请添加allow-default:nullable=true,在我的例子中,我正在创建一个新表,所以新表中没有任何数据。

正确,但问题是要添加默认值而不是空值

@如我在第一个回答中所说,它将添加默认值作为当前时间戳。但是,如果您试图将此应用于已存在的具有数据列的表,那么,这将不起作用,就像有任何具有空值的行一样,那么当alter查询运行时,它将不知道要将哪个时间戳放入这些列中。不是吗?我希望这能消除你可能有的困惑

为我和mysql和symfony 3.4一起工作。

...

fields:

start_date:

type: date

nullable: false

options:

default: '1910-01-01'

comment: 'The default date is 1910-01-01'

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值