本文已经迁移至我的个人技术博客:
Laravel 5.3+ 自动添加创建时间(created_at)与更新时间(updated_at)详解
注意:文章内容建立在Migrations
之上,如果你对Migration不熟悉,可以先参考 Laravel数据库迁移(Database Migration)操作实例
在Laravel 5.3
之前,migrations
中的$table->timestamps()
所创建的created_at
及updated_at
两个column
都是不允许为空的,而在5.3
开始,官方文档中写道:
Command | Description |
---|---|
$table->timestamps(); | Adds nullable created_at and updated_at columns. |
我们可以看到,现在这两个column
都可以为NULL
。
如果我们保留默认的migration
,那么在更新及插入数据时,Laravel
会自动帮我们处理好created_at
和updated_at
两个时间戳,即插入数据时,两者都被更新为服务器当前时间,更新数据时,updated_at
被更新为操作发生时间。
但是如果我们后端代码没有使用Laravel
,例如我们需要使用Python
来插入一部分数据,那么我们有两种选择:
- 手动生成时间并插入
- 在
migration
文件中,调整created_at
及updated_at
的类型
第一种显而易见,那么我们就不多说。
第二种方法,我们将原有的$table->timestamps()
去掉,然后添加上以下代码:
use Illuminate\Support\Facades\DB;
...
public function up()
{
...
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
...
}
...
注意,我们需要引入DB Facade
来使用DB::raw
语句。那么我们看到,现在created_at
以及updated_at
两个column
被分别用timestamp()
进行声明,我们看一下官方文档怎么写的:
Command | Description |
---|---|
$table->timestamp(‘added_on’); | TIMESTAMP equivalent for the database. |
可以看到,使用timestamp()
声明的column
不能为NULL
。
那么我们需要添加两个column
的默认值:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
这样一来,我们在未使用Laravel
而需要操作数据库时,不需要主动插入时间,数据库也会帮我们自动插入及更新时间戳。