【发布时间】:2015-09-05 07:25:52
【问题描述】:
所以我的应用中有一个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 的实例。
但是,当我生成一些 Posts 时,我发现 published_at 字段为空,这表明 DateTime 实例没有被正确解释。
我发现如果我把那行改成:
'published_at' => Carbon::instance($faker->dateTimeThisMonth())->toDateTimeString(),
本质上将DateTime 转换为Carbon,然后输出日期时间字符串,例如"2015-06-15 13:44:23",它工作正常。
这真的是在模型工厂中定义虚假日期的最佳方法吗?我本以为我在 $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_at 和 created_at 字段仍为空。有什么想法吗?
【问题讨论】:
-
我看过一些 Laracasts 视频,Jeffrey 总是在工厂内使用 Carbon。所以,我会说这是最好的方法
标签: php datetime laravel laravel-5