我想使用Laravel Schema Builder/Migrations创建一个默认值为CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP的时间戳列。我已经多次阅读Laravel文档,我不知道如何将其作为时间戳列的默认值。

timestamps()函数将它所生成的两列的默认值设置为0000-00-00 00:00。


当前回答

但事实并非如此:

$table->timestamp('created_at')->default('CURRENT_TIMESTAMP');

它不会删除选择时间戳时似乎附带的'default 0',只是附加了自定义的默认值。但我们不需要引号。并不是所有操作DB的东西都来自Laravel4。这就是他的观点。他想在某些列上自定义默认值,比如:

$table->timestamps()->default('CURRENT_TIMESTAMP');

我觉得拉威尔不可能。我已经找了一个小时了,看看有没有可能。


更新:保罗·弗雷塔的回答表明这是可能的,但语法并不简单。

其他回答

在Laravel 5中:

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

文档:http://laravel.com/docs/5.1/migrations creating-columns

它将100%工作。通过这种方式,您可以在更改列的datetype后设置默认的datetime值。

Schema::table('table_name', function (Blueprint $table) {
            $table->dateTime('ans_time')->default(now())->change();
        });

作为未来谷歌人的额外可能性

我发现,当记录被创建但从未被修改时,在updated_at列中设置null更有用。它减少了数据库大小(好吧,只是一点点),它可以在第一眼看到数据从未被修改过。

我使用的是:

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->default(DB::raw('NULL ON UPDATE CURRENT_TIMESTAMP'))->nullable();

(在Laravel 7+8与mysql 8)。


编辑:因为Laravel 8你还可以使用:

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->nullable()->useCurrentOnUpdate();

达到同样的效果。

感谢@bilogic指出这一点。

在laravel 7,8中设置当前时间使用以下方法:

$table->timestamp('column_name')->useCurrent();

从Laravel 5.1.26开始,标签为2015-12-02,添加了useCurrent()修饰符:

Schema::table('users', function ($table) {
    $table->timestamp('created')->useCurrent();
});

PR 10962(随后是commit 15c487fe)导致了这一添加。

您可能还想阅读感兴趣的第3602和11518期。

基本上,MySQL 5.7(默认配置)要求您为时间字段定义一个默认值或可空值。