我有一个具有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_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,
答案 0 :(得分:26)
当您插入不使用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不会试图让他们继续前进。
<强> EDIT2 强>
还有一个更重要的问题。如果你在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
答案 1 :(得分:2)
对于更高版本,您只需使用即可。 (source)
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
答案 2 :(得分:0)
如果我在时间戳中播种并在工厂中进行设置,我会使用碳库。 如果没有,你可以做这样的事情:
$timestamps = false;
我会删除$table->timestamps();
如果我不打算使用它,请从迁移中获取。