Laravel Model Factories and Eloquent;设定日期

时间:2015-06-19 10:33:50

标签: php datetime laravel laravel-5

所以我的应用程序中有一个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字段为空,表明DateTime实例未被正确解释。

我发现如果我将该行更改为:

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

基本上将DateTime转换为Carbon,然后输出日期时间字符串,例如"2015-06-15 13:44:23",它运作正常。

这真的是在模型工厂中定义faker日期的最佳方式吗?我会想到我在published_at数组中定义$dates的事实Laravel会解释DateTime(或Carbon)实例并保存它而不必提供字符串。

修改

我发现这也不适用于简单的Eloquent创建:

E.g。如果我跑

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

published_atcreated_at字段仍为空。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

由于Faker返回一个DateTime-Object,它不代表像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)

之类的日期

答案 1 :(得分:0)

您可以在模型工厂内使用Carbon日期而不会出现问题。

为了使其有效,请将published_atcreated_at添加到$fillable媒体资源。

然后它应该可以正常工作。