Doctrine 2.1 - datetime column default value
有人能告诉我如何在datetime列上添加默认值吗?我不能这样做:
1
| protected $registration_date = date("Y-m-d H:i:s", time()); |
那怎么办?
对于默认值,当前时间戳:
1
| @ORM\Column(name="created_at", type="datetime", options={"default":"CURRENT_TIMESTAMP"}) |
。
或者对于旧的symfony版本:
1
| @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号
如果希望非常精确,还可以使用生命周期回调:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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/…
将属性映射为日期时间类型,然后使用新的日期时间实例在构造函数中设置值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| /**
* @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网站
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| /**
* @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完成自动填充的最佳方法是这样:
1
| * @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"}) |
。
将逻辑放入构造函数不是正确的解决方案,因为设置默认值是SQL客户端的责任。如果您决定不再使用ORM,您将失去业务逻辑。另外,如果使用构造函数,您将无法向现有行的datetime属性添加默认时间戳。
- 谢谢:D最佳答案
- 这在条令2.5中不起作用。
- 如下文所述,"default": 0更适用于学说迁移。
1
| @var string @ORM\Column(name="login_at", type="datetime", options={"default" ="CURRENT_TIMESTAMP"}) |
。
这是可行的。只是为了将来的参考。
- 这不起作用:违反完整性约束:1048列的"登录位置"不能为空
- @如果您没有该表的任何数据,上述方法将有效。意味着如果已经有了列,则必须为每行向该列添加一些值。或者,请添加allow-default:nullable=true,在我的例子中,我正在创建一个新表,所以新表中没有任何数据。
- 正确,但问题是要添加默认值而不是空值
- @如我在第一个回答中所说,它将添加默认值作为当前时间戳。但是,如果您试图将此应用于已存在的具有数据列的表,那么,这将不起作用,就像有任何具有空值的行一样,那么当alter查询运行时,它将不知道要将哪个时间戳放入这些列中。不是吗?我希望这能消除你可能有的困惑
为我和mysql和symfony 3.4一起工作。
1 2 3 4 5 6 7 8 9
| ...
fields :
start_date :
type : date
nullable : false
options :
default: '1910-01-01'
comment : 'The default date is 1910-01-01'
... |