2015-06-19 56 views
4

所以,我有我的應用程序的App\Post模型,定義如下:Laravel模型工廠和雄辯;設定日期

namespace App; 
class Post extends Model 
{ 

    use SoftDeletes; 

    protected $dates = ['created_at', 'updated_at', 'published_at', 'deleted_at']; 
    // etc... 
} 

我創建了一個模型工廠,一個不錯的新功能,如Laravel 5.1的定義Post的藍圖如下:

$factory->define('App\Post', function($faker) { 
    return [ 
    'title'  => $faker->sentence, 
    'content' => $faker->paragraph, 
    'published_at' => $faker->dateTimeThisMonth(), 
    ]; 
}); 

我們可以看到我設置published_at場這個月是一個隨機的日期,由Faker實例作爲產生。使用的方法返回DateTime的實例。

但是,當我生成一些Post s我發現published_at字段爲空,這表明DateTime實例未被正確解釋。

我發現,如果我改變該行:

'published_at' => Carbon::instance($faker->dateTimeThisMonth())->toDateTimeString(), 

基本上轉換DateTimeCarbon然後例如輸出日期時間串"2015-06-15 13:44:23",它工作正常。

這是真的是最好的方式來定義模型工廠的日期日期?我會想到,我在$dates陣列中定義了published_at這一事實,Laravel會解釋DateTime(或Carbon)實例並保存它,而不必提供字符串。

編輯

我發現,這也是不工作的簡單雄辯創建:

例如如果我跑

App\Post::create([ 
    'title' => $title, 
    'content' => $faker->paragraph(4),  
    'published_at' => new Carbon, 
    'created_at' => Carbon::parse('2015-06-16') 
]); 

published_atcreated_at領域仍然空。有任何想法嗎?

+0

我見過一些Laracasts視頻,Jeffrey總是在工廠裏使用Carbon。所以,我會說這是最好的方式 – zeratulmdq

回答

2

由於Faker返回一個DateTime對象,它不像mysql那樣代表日期字符串(Y-m-d H:i:s),該字段將被設置爲null。

然而,你應該能夠訪問的對象屬性date得到正確的字符串是這樣的:

$faker->dateTimeThisMonth()->format('Y-m-d H:i:s') 

這應返回這樣string '2015-06-19 13:07:07' (length=19)

+0

是的,基本上這就是我正在做的,但我只是使用Carbon方法來生成字符串。基本上我想要的是能夠將日期時間或碳實例設置爲日期並將其保存在數據庫中。這是[在文檔](http://laravel.com/docs/5.1/eloquent-mutators#date-mutators)描述,但我沒有得到這種行爲。 – harryg

0

日期可以使用內部模型工廠Carbon日期沒有問題。

爲了使其工作,請將published_atcreated_at添加到$fillable屬性。

然後它應該工作正常。