Laravel overridden/appended 日期属性未在 json 输出中序列化

Laravel overridden/appended date attributes aren't serialized in json output

我有一个 Organization 模型,它有两个数据属性,allowance_starts_atallowance_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?