我有一个组织模型,该模型具有两个数据属性,即allowance_starts_at
和allowance_ends_at
,当返回此模型作为JSON时,我会得到以下备份:
allowance_starts_at: "2017-06-01 00:00:00",
allowance_ends_at: "2018-05-31 23:59:59",
但是,我想覆盖这些属性将年度设置为当年(或津贴期),所以我希望属性返回2018-06-01:
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;
}
这有效,并给我带来的结果,但是现在,当我输出模型时,碳日期未序列化时:
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"
},
我还使用附加属性对此进行了测试,因此,我没有覆盖现有属性,而是创建一个附加属性,该属性刚刚返回 Carbon::now()
并将附加属性设置为$ dates数组中的附加属性,并且以相同的方式输出,即未序列化。
现在有人会如何确定如何输出属性,例如作为碳还是字符串?
有人知道我如何做这项工作吗?
update
谢谢保罗。使用设置器突变器给了我所需的行为。我用:
替换了我的压倒方法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;
}
现在,我在返回JSON时得到此输出:
allowance_starts_at: "2018-06-01 00:00:00",
allowance_ends_at: "2019-05-31 23:59:59",
您是否尝试过使用突变器?就像getallowanceendsattribute相比,使其成为setallowanceEndSattribute?