最近、Laravelのviewファイルで Call to a member function format() on string というエラーに直面しました。原因は、文字列として認識されているプロパティから format() メソッドを呼び出そうとしたためでした。
解決方法は複数存在するようですが、モデルで日付フィールドを明示的に指定する方法が一番簡単に思えたので採用しました。(Laravelでは、日付や時刻を扱う際にCarbonインスタンスの使用が一般的とのこと)
例として、以下のコードではBorrowモデルに$castsプロパティを追加し、borrowed_atフィールドをCarbonインスタンスとして扱うようにLaravelに指示しています。(型変換=キャスト)
class Borrow extends Model
{
// ...
protected $casts = [
'borrowed_at' => 'datetime',
];
// ...
}
この変更により、$borrow->borrowed_at は自動的にCarbonインスタンスに変換され、viewファイルにてformat() メソッドが利用可能になりました。
(以前のバージョンではdatesプロパティでもキャストできたようですが、Laravel10ではこちらのプロパティは削除されたようです)
勉強になったのが、たとえマイグレーションでカラムを datetime型に指定していたとしても(私の場合は date 型でした)、モデルに$castsプロパティを設定していなければ、そのカラムはPHPレベルでは単なる文字列として扱われるということ。これは、データベースとPHP(Laravel)間でのデータ型の扱い方に違いがあるためのようです。
・PHP(Laravel)レベル: Laravelはデータベースからデータを取得する際、特に指定がなければ、日付と時刻のデータを文字列として扱う。これはPHPがデータベースの日付型に対応するビルトインのデータ型を持たないため。
・型キャストが必要: Laravelで datetime 型のデータを Carbon インスタンスとして扱いたい場合、モデルで明示的に型キャストを指定する必要がある。これにより、データを取得する際にLaravelが自動的に Carbonインスタンスへと変換してくれる。
初歩的な問題かもしれませんが、自分なりの備忘録も兼ねて投稿してみました。