代码之家  ›  专栏  ›  技术社区  ›  Owen Kelvin

如何同时使用$dates数组和Factory

  •  0
  • Owen Kelvin  · 技术社区  · 4 年前

    我有一家定义如下的工厂

    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 .

    我该如何解决这个问题?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Basharmal    4 年前

    自从 Faker 正在返回a 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'),
        ];
    }
    

    这应该返回这样的日期 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';
    }
    
    推荐文章