Laravel覆盖/追加的日期属性不会在json输出中序列化



我有一个组织模型,该模型具有两个数据属性,即allowance_starts_atallowance_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?

最新更新