Laravel 时间戳() 不会创建CURRENT_TIMESTAMP

我有一个有该方法的迁移,然后我有一个种子来播种这个表。timestamps()

Schema::create('mytable', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->timestamps();
});

种子看起来像这样:

DB::table('mytable')->insert([
    [
        'title' => 'My Awesome Title'
    ]
]);

当一切都运行时,使用:

php artisan migrate:refresh --seed

插入项目,但 和 的值都是为什么它们设置不正确?created_atupdated_at0000-00-00 00:00:00

以下是它创建的列方案:

`created_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

我想要这些方案:

`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

答案 1

当您不使用 Eloquent 插入数据时,您需要自己插入时间戳。

如果您使用:

$x = new MyTable();
$x->title = 'My Awesome Title';
$x->save();

您将正确填写时间戳(当然,您需要先创建模型)MyTable

编辑

如果你真的想要它,你可以改变:

$table->timestamps();

到:

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

如果为此表创建模型,则应设置

$timestamps = false;

以确保Eloquent不会试图让他们走上正轨。

编辑2

还有一个更重要的问题。如果你在PHP的表中混合设置日期,在MySQL中混合使用其他表格,你应该确保在PHP和MySQL中都有完全相同的日期时间(和时区),或者你应该使用与记录中设置的日期相同的日期比较(MySQL或PHP)。否则,在运行查询时,您可能会得到意外的结果,例如

SELECT * FROM mytable WHERE DATE(created_at) = CURDATE()

可能与使用传递 PHP 日期运行查询不同

"SELECT * FROM mytable WHERE DATE(created_at) = '".date('Y-m-d")."'"

因为在PHP服务器上它可能是例如2015-12-29,但在MySQL服务器上2015-12-30


答案 2

对于更高版本,您可以简单地使用。(来源)

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

推荐