Laravel 数据迁移(Migrations)中 timestamp / dateTime / date / timestamps 的不同

说明

Laravel 数据迁移(Migrations) 中提供了几种创建时间的帮助函数,这里说下他们的不同点。

$table->timestamp('published_at');
$table->dateTime('published_at');
$table->date('published_at');
$table->timestamps();

timestamp() 和 dateTime()

timestamp 和 dateTime 类似,他们存储了 日期(YYYY-MM-DD) 加上 时间 (HH:MM:SS) ,如:YYYY-MM-DD HH:MM:SS。

不同的是 timestamp 可以利用 MySQL 的 CURRENT_TIMESTAMP 方法,从数据库层面去维护 created_at 和 updated_at ,参考 Illuminate/Database 源码中 MYSQL 创建 Timestamp 类型字段代码

需要注意的是,timestamp 的数据范围是 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC ,也就是说大于 2038-01-19 03:14:07 的值数据库是无法存储的,会变为 0000-00-00 00:00:00,这也是 MySQL 知名的 2038年问题

dateTime 的存储范围是 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59,所以,在选择字段的存储类型的时候,请仔细考虑下用例。

date()

只是存储了日期格式,如:YYYY-MM-DD (1000-00-01~ 9999-12-31)

timestamps()

创建了 created_at 和 updated_at 字段,格式为 timestamp。

【番外篇】更改 timestamps 为 dateTime

既然 timestamps 有 2038年问题,你想使用 dateTime 的话,在 Laravel 中,你只需要在创建的时候,指定为 dateTime 类型即可:

$table->dateTime('created_at');
$table->dateTime('updated_at');

Laravel 将会自动维护(感谢 @程事不足 指出)。

参阅文档:时间戳

现有字段修改

可以使用(Thanks @zhuzhichao ):

 $table->datetime('update_at')->change(); 

Practice makes perfect.

本帖已被设为精华帖!
本帖由 Summer 于 2年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2

好像用其他格式的时间戳也可以自动维护的吧

2年前
Summer

@程事不足 确实可以,多谢指出

2年前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!