PHP Laravel NGINX html css Bootstrap Python Symfony Apache Windows linux jquery Django ASP vanilla Slim vagrant docker Homestead MySQL Redis Git SVN ssh Root vim PhpStorm Pycharm sass less PHP Laravel android html css Vue Angular React NGINX html css Javascript

Laravel 5.5+ 自动添加创建时间(created_at)与更新时间(updated_at)详解

原创

原创不易 ~ 转载请注明出处哦

**注意:文章内容以在Laravel的数据库迁移(Migrations)为基础,如果你对Migrations不熟悉,可以先参考我的另一篇文章:

Laravel 数据库迁移(Database Migrations)操作实例

Laravel 5.3之前,migrations中的$table->timestamps()所创建的created_atupdated_at两个column都是不允许为空的,而在5.3开始,官方文档中写道:

CommandDescription
$table->timestamps();Adds nullable created_at and updated_at columns.

我们可以看到,现在这两个column都可以为NULL

如果我们保留默认的migration,那么在更新及插入数据时,Laravel会自动帮我们处理好created_atupdated_at两个时间戳,即插入数据时,两者都被更新为服务器当前时间,更新数据时,updated_at被更新为操作发生时间。

但是如果我们后端代码没有使用Laravel,例如我们需要使用Python来插入一部分数据,那么我们有两种选择:

  1. 手动生成时间并插入
  2. migration文件中,调整created_atupdated_at的类型

第一种显而易见,那么我们就不多说。
第二种方法,我们将原有的$table->timestamps()去掉,然后添加上以下代码:

use Illuminate\Support\Facades\DB;

[...]

    public function up()
    {
	    [...]
		$table->timestamp('created_at')->useCurrent();
		$table->timestamp('updated_at')->useCurrent();
		[...]
	}
[...]

注意useCurrent()这个函数从Laravel 5.5+才被引入Migrations,使用useCurrent()可以适用于MySQLPostgreSQLLaravel支持的数据库,从而避免了之前需要使用DB:raw()来声明column的尴尬局面。

我们看一下官方文档如何描述useCurrent()的:

ModifierDescription
->useCurrent()Set TIMESTAMP columns to use CURRENT_TIMESTAMP as default value

这样一来,我们在未使用Laravel而需要操作数据库时,不需要主动插入时间,数据库也会帮我们自动插入及更新时间戳。


正在加载验证码......
请先完成验证