2015-12-29 89 views
8

我有一个具有timestamps()方法的迁移,然后我有一个种子来为此表播种。Laravel时间戳()不会创建CURRENT_TIMESTAMP

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_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, 
+1

使用Eloquent模型创建记录而不是Fluent界面,应正确设置它们。 –

回答

23

当你不使用雄辩,你需要在自己的插入时间戳插入数据。

如果你使用:

$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; 

确保雄辩不会试图把它们放在他的去路。

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

+0

我不认为这是问题...我更新了问题... –

+0

@GetOffMyLawn请看看我的编辑 –

+0

好吧,我确实有(只是注释掉了)。所以这就是如何做,我认为拉拉维尔会做到这一点。好的,谢谢 –

0

我会使用碳库,如果我在时间戳播种和设置在工厂。 如果不是你可以做这样的事情:

$timestamps = false; 

,如果我不打算使用它,我会从迁移中删除的$table->timestamps();

0

对于以后的版本,您可以简单地使用。 (source

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