如何一起使用 $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';
}
我有一个定义如下的工厂
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';
}