Eloquentで日付型のカラムを日付型にキャストするようにしました。
キャストしたカラムに対して、メソッドチェーンで日付の加減算の操作を行ったのですが、値が変更されませんでした。
対策としてはいったん変数で受けて、日付の加減算を行った後にモデルに戻すことになります。
結論は出たのですが、なぜそのようになるのかを追ってみました。
キャストするとImmutableになる?
挙動としてはImmutableな挙動のように見えました。
キャストしたカラムの型を確認しましたが、\Illuminate\Support\Carbon
となっていました。
キャストの実装を確認する
型には問題がないため、実装を確認します。
一部を抜粋します。
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); } // 省略。。。 } }
Illuminate/Database/Eloquent/Concerns/HasAttributes.php#asDateTime
Eloquentで日付にキャストする場合は、Date::instance
を通るので、メソッドチェーンで計算してもダメなんですね。
コメント