Laravel timestamps() 不会创建 CURRENT_TIMESTAMP
Laravel timestamps() doesn't create CURRENT_TIMESTAMP
我有一个具有 timestamps()
方法的迁移,然后我有一个种子来播种这个 table。
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_at
和 updated_at
的值都是 0000-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,
当您不使用 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'));
如果您为此table创建模型,您应该设置
$timestamps = false;
确保 Eloquent 不会试图在途中设置它们。
EDIT2
还有一个更重要的问题。如果您将 PHP 中的 table 中的设置日期与 MySQL 中的其他设置日期混合使用,您应该确保 PHP 和 MySQL 中的设置日期完全相同datetime(和时区)或者您应该使用与您在记录中设置的相同的日期比较(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
如果我在时间戳中播种并在工厂中设置它,我会使用 carbon 库。
如果没有,你可以这样做:
$timestamps = false;
我会删除 $table->timestamps();
如果我不打算使用它,请从迁移中获取。
以后的版本,直接使用即可。 (source)
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
我有一个具有 timestamps()
方法的迁移,然后我有一个种子来播种这个 table。
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_at
和 updated_at
的值都是 0000-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,
当您不使用 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'));
如果您为此table创建模型,您应该设置
$timestamps = false;
确保 Eloquent 不会试图在途中设置它们。
EDIT2
还有一个更重要的问题。如果您将 PHP 中的 table 中的设置日期与 MySQL 中的其他设置日期混合使用,您应该确保 PHP 和 MySQL 中的设置日期完全相同datetime(和时区)或者您应该使用与您在记录中设置的相同的日期比较(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
如果我在时间戳中播种并在工厂中设置它,我会使用 carbon 库。 如果没有,你可以这样做:
$timestamps = false;
我会删除 $table->timestamps();
如果我不打算使用它,请从迁移中获取。
以后的版本,直接使用即可。 (source)
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();