【问题标题】:Laravel Model Factories and Eloquent; setting datesLaravel 模型工厂和 Eloquent;设定日期
【发布时间】: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_atcreated_at 字段仍为空。有什么想法吗?

【问题讨论】:

  • 我看过一些 Laracasts 视频,Jeffrey 总是在工厂内使用 Carbon。所以,我会说这是最好的方法

标签: php datetime laravel laravel-5


【解决方案1】:

由于 Faker 返回的 DateTime-Object 不代表 mysql 喜欢的日期字符串 (Y-m-d H:i:s),因此该字段将设置为 null。

但是,您应该能够访问 objects 属性 date 以获取正确的字符串,如下所示:

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

这应该返回像这样的日期string '2015-06-19 13:07:07' (length=19)

【讨论】:

  • 是的,基本上这就是我正在做的,但我只是使用 Carbon 方法来生成字符串。本质上,我想要的是能够将 DateTime 或 Carbon 实例设置为日期并雄辩地将其保存在数据库中。这被描述为in the docs,但我没有得到这种行为。
【解决方案2】:

您可以毫无问题地在模型工厂内使用Carbon 日期。

为了使其正常工作,请将published_atcreated_at 添加到$fillable 属性中。

那么它应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 2018-02-08
    • 2017-04-11
    • 2023-02-04
    • 1970-01-01
    • 2021-11-26
    • 2017-08-28
    • 2018-09-03
    相关资源
    最近更新 更多