0

我有一个具有以下定义的工厂

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'
]

上述工作按预期工作,直到要求返回该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数组,测试通过。在检查传递给请求的对象时,我看到的日期格式{"name":1995,"start_date":"1995-04-04T00:00:00.000000Z","end_date":"1995-04-04T00:00:00.000000Z"}Factory.

我该如何解决这个问题?

4

1 回答 1

2

因为Faker返回的 aDateTime-Object不代表mysql喜欢它的日期字符串 ( Y-m-d H:i:s)。

但是,您应该能够访问 objects 属性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'),
    ];
}

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

或者

默认情况下,时间戳的格式为“Ymd 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';
}
于 2021-04-04T00:47:04.173 回答