如何一起使用 $dates 数组和 Factory

How to use $dates array and Factory together

我有一个定义如下的工厂

public function definition()
{
    $startDate = Carbon::createFromFormat('Y', $this->faker->year);
    $endDate = $startDate->addYear();

    return [
        'name' => $startDate->year,
        'start_date' => $startDate->format('Y-m-d'),
        'end_date' => $endDate->format('Y-m-d'),
    ];
}

所以这会生成如下所示的数组

[
    'name' => 2020,
    'start_date' => '2020-01-30',
    'end_date' => '2021-01-30'
]

以上内容按预期工作,直到出现对 return start_date 字段和 end_date 字段的要求。所以在我的模型中我添加了:

protected $dates = ['created_at', 'updated_at', 'start_date', 'end_date'];

在我的验证器中,我验证格式为 Y-m-d

public function rules()
{
    return [
        'name' => 'required|unique:academic_years',
        'start_date' => 'required|date_format:Y-m-d|before_or_equal:end_date',
        'end_date' => 'required|date_format:Y-m-d',
    ];
}

我还有以下测试:

public function should_throw_error_if_date_format_is_invalid()
{
    Permission::factory()->state(['name' => 'create academic year'])->create();

    $user = User::factory()->create();
    $user->givePermissionTo('create academic year');

    $this->actingAs($user, 'api')->postJson('/api/academic-years', [
        'name' => $this->faker->year,
        'start_date' => '01-01-2019',
        'end_date' => '2019-01-01'
    ])->assertStatus(422);

    $this->actingAs($user, 'api')->postJson('/api/academic-years', [
        'name' => $this->faker->year,
        'end_date' => '01-01-2019',
        'start_date' => '2019-01-01'
    ])->assertStatus(422);
}

测试失败,但如果我删除 $dates 数组,测试通过。在检查传递到请求中的对象时,我看到了与 Factory.

中提供的格式不同的日期格式 {"name":1995,"start_date":"1995-04-04T00:00:00.000000Z","end_date":"1995-04-04T00:00:00.000000Z"}

我该如何解决这个问题?

因为 Faker 正在 returning 一个 DateTime-Object,它不代表 mysql 喜欢的日期字符串 (Y-m-d H:i:s)。

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

试试这个

public function definition()
{
    $startDate = Carbon::createFromFormat('Y', $this->faker->year);
    $endDate = $startDate->addYear();
    
    return [
        'name' => $startDate->year,
        'start_date' => $startDate->format('Y-m-d H:i:s'),
        'end_date' => $endDate->format('Y-m-d H:i:s'),
    ];
}

这应该 return 这样的日期 string '1995-04-04T00:00:00.000000Z'

默认情况下,时间戳的格式为 'Y-m-d H:i:s'。如果您需要自定义时间戳格式,请在您的模型上设置 $dateFormat 属性。 属性 确定日期属性在数据库中的存储方式,以及模型序列化为数组时的格式或 JSON:

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * The storage format of the model's date columns.
     *
     * @var string
     */
    protected $dateFormat = 'U';
}