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
を通るので、メソッドチェーンで計算してもダメなんですね。
[AD]