簡體   English   中英

Laravel Model Factories and Eloquent; 設定日期

[英]Laravel Model Factories and Eloquent; setting dates

所以我在我的應用程序中有一個App\\Post模型,定義如下:

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我發現published_at字段為null,表明沒有正確解釋DateTime實例。

我發現如果我將該行更改為:

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

它實質上將DateTime轉換為Carbon ,然后輸出日期時間字符串,例如"2015-06-15 13:44:23" ,它可以正常工作。

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

編輯

我發現這也不適用於簡單的Eloquent創建:

比如,如果我跑

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

published_atcreated_at字段仍為null。 有任何想法嗎?

由於Faker返回一個DateTime-Object,它不代表像mysql這樣的日期字符串,所以它( Ymd H:i:s )將該字段設置為null。

但是,您應該能夠訪問對象屬性date以獲取正確的字符串,如下所示:

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

這應該返回一個像這個string '2015-06-19 13:07:07' (length=19)的日期string '2015-06-19 13:07:07' (length=19)

您可以在模型工廠內使用Carbon日期而不會出現問題。

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

那它應該工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM