2015-12-29 85 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();