Laravel overridden/appended 日期属性未在 json 输出中序列化
Laravel overridden/appended date attributes aren't serialized in json output
我有一个 Organization 模型,它有两个数据属性,allowance_starts_at
和 allowance_ends_at
,当 return 将该模型设置为 JSON 时,我得到以下结果:
allowance_starts_at: "2017-06-01 00:00:00",
allowance_ends_at: "2018-05-31 23:59:59",
但是我想覆盖这些属性以将年份设置为当前年份(或津贴期)所以 2018-06-01 来我希望属性为 return:
allowance_starts_at: "2018-06-01 00:00:00",
allowance_ends_at: "2019-05-31 23:59:59",
为了实现这一点,我重写了模型中的属性,如下所示:
public function getAllowanceStartsAtAttribute($value)
{
$currentYear = Carbon::now()->format('Y');
$d = Carbon::createFromFormat('Y-m-d H:i:s', $value);
$d->year($currentYear);
return $d;
}
public function getAllowanceEndsAtAttribute($value)
{
$d = Carbon::createFromFormat('Y-m-d H:i:s', $value);
if ($d->copy()->subYear()->addSecond() != $this->allowance_starts_at) {
$d->addYear();
}
return $d;
}
这有效并给出了我想要的结果,但是现在当我将模型输出为 JSON 时,Carbon 日期未序列化:
allowance_starts_at: {
date: "2017-01-01 00:00:00.000000",
timezone_type: 3,
timezone: "Europe/London"
},
allowance_ends_at: {
date: "2017-12-31 23:59:59.000000",
timezone_type: 3,
timezone: "Europe/London"
},
我还使用附加属性对此进行了测试,因此我没有覆盖现有属性,而是创建了一个附加属性,它只是 returned Carbon::now()
并在 $dates 数组中设置了附加属性这以相同的方式输出,即未序列化。
现在有人知道如何 Laravel 确定如何输出属性吗?作为 Carbon 还是字符串?
有谁知道我该怎么做?
更新
谢谢保罗。使用 setter 突变器为我提供了我需要的行为。我将我的重写方法替换为:
public function setAllowanceStartsAtAttribute($value)
{
$currentYear = Carbon::now()->format('Y');
$value->year($currentYear);
$this->attributes['allowance_starts_at'] = $value;
}
public function setAllowanceEndsAtAttribute($value)
{
if ($value->copy()->subYear()->addSecond() != $this->attributes['allowance_starts_at']) {
$value->addYear();
}
$this->attributes['allowance_ends_at'] = $value;
}
现在我在 returning JSON:
时得到这个输出
allowance_starts_at: "2018-06-01 00:00:00",
allowance_ends_at: "2019-05-31 23:59:59",
您尝试过使用修改器吗?就像不是 getAllowanceEndsAtAttribute,让它成为 setAllowanceEndsAtAttribute?
我有一个 Organization 模型,它有两个数据属性,allowance_starts_at
和 allowance_ends_at
,当 return 将该模型设置为 JSON 时,我得到以下结果:
allowance_starts_at: "2017-06-01 00:00:00",
allowance_ends_at: "2018-05-31 23:59:59",
但是我想覆盖这些属性以将年份设置为当前年份(或津贴期)所以 2018-06-01 来我希望属性为 return:
allowance_starts_at: "2018-06-01 00:00:00",
allowance_ends_at: "2019-05-31 23:59:59",
为了实现这一点,我重写了模型中的属性,如下所示:
public function getAllowanceStartsAtAttribute($value)
{
$currentYear = Carbon::now()->format('Y');
$d = Carbon::createFromFormat('Y-m-d H:i:s', $value);
$d->year($currentYear);
return $d;
}
public function getAllowanceEndsAtAttribute($value)
{
$d = Carbon::createFromFormat('Y-m-d H:i:s', $value);
if ($d->copy()->subYear()->addSecond() != $this->allowance_starts_at) {
$d->addYear();
}
return $d;
}
这有效并给出了我想要的结果,但是现在当我将模型输出为 JSON 时,Carbon 日期未序列化:
allowance_starts_at: {
date: "2017-01-01 00:00:00.000000",
timezone_type: 3,
timezone: "Europe/London"
},
allowance_ends_at: {
date: "2017-12-31 23:59:59.000000",
timezone_type: 3,
timezone: "Europe/London"
},
我还使用附加属性对此进行了测试,因此我没有覆盖现有属性,而是创建了一个附加属性,它只是 returned Carbon::now()
并在 $dates 数组中设置了附加属性这以相同的方式输出,即未序列化。
现在有人知道如何 Laravel 确定如何输出属性吗?作为 Carbon 还是字符串?
有谁知道我该怎么做?
更新
谢谢保罗。使用 setter 突变器为我提供了我需要的行为。我将我的重写方法替换为:
public function setAllowanceStartsAtAttribute($value)
{
$currentYear = Carbon::now()->format('Y');
$value->year($currentYear);
$this->attributes['allowance_starts_at'] = $value;
}
public function setAllowanceEndsAtAttribute($value)
{
if ($value->copy()->subYear()->addSecond() != $this->attributes['allowance_starts_at']) {
$value->addYear();
}
$this->attributes['allowance_ends_at'] = $value;
}
现在我在 returning JSON:
时得到这个输出allowance_starts_at: "2018-06-01 00:00:00",
allowance_ends_at: "2019-05-31 23:59:59",
您尝试过使用修改器吗?就像不是 getAllowanceEndsAtAttribute,让它成为 setAllowanceEndsAtAttribute?