[Eloquent] datetimeのメソッドチェーンの落とし穴

Eloquentで日付型のカラムを日付型にキャストするようにしました。
キャストしたカラムに対して、メソッドチェーンで日付の加減算の操作を行ったのですが、値が変更されませんでした。
対策としてはいったん変数で受けて、日付の加減算を行った後にモデルに戻すことになります。

結論は出たのですが、なぜそのようになるのかを追ってみました。

キャストするとImmutableになる?

挙動としてはImmutableな挙動のように見えました。
キャストしたカラムの型を確認しましたが、\Illuminate\Support\Carbonとなっていました。

キャストの実装を確認する

型には問題がないため、実装を確認します。
一部を抜粋します。

HasAttributes.php
<?php

namespace Illuminate\Database\Eloquent\Concerns;

use Carbon\CarbonInterface;
use Illuminate\Support\Facades\Date;

trait HasAttributes
{
    protected function asDateTime($value)
    {
        // If this value is already a Carbon instance, we shall just return it as is.
        // This prevents us having to re-instantiate a Carbon instance when we know
        // it already is one, which wouldn't be fulfilled by the DateTime check.
        if ($value instanceof CarbonInterface) {
            return Date::instance($value);
        }

        // 省略。。。
    }
}

Eloquentで日付にキャストする場合は、Date::instanceを通るので、メソッドチェーンで計算してもダメなんですね。