所以我的应用程序中有一个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_at
和created_at
字段仍为空。有什么想法吗?
答案 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_at
和created_at
添加到$fillable
媒体资源。
然后它应该可以正常工作。