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

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


当前回答

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

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

其他回答

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

我发现,当记录被创建但从未被修改时,在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中使用以下自定义:

默认created_at为当前时间戳 更新记录时更新时间戳

首先,我将在Laravel的根目录下创建一个helpers.php文件,并插入以下内容:

<?php

if (!function_exists('database_driver')) {
    function database_driver(): string
    {
        $connection = config('database.default');
        return config('database.connections.' . $connection . '.driver');
    }
}

if (!function_exists('is_database_driver')) {
    function is_database_driver(string $driver): bool
    {
        return $driver === database_driver();
    }
}

在作曲家。json,我将插入以下到自动加载。这允许编写器自动发现helpers.php。

    "autoload": {
        "files": [
            "app/Services/Uploads/Processors/processor_functions.php",
            "app/helpers.php"
        ]
    },

我在Laravel模型中使用以下方法。

        if (is_database_driver('sqlite')) {
            $table->timestamps();
        } else {
            $table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
            $table->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
        }

这允许我的团队继续使用sqlite进行单元测试。ON UPDATE CURRENT_TIMESTAMP是MySQL的快捷方式,在sqlite中不可用。

这就是你怎么做的,我已经检查过了,它在我的Laravel 4.2上工作。

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

希望这能有所帮助。

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

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

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

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