Laravelで「Call to a member function format() on string」の対処法

1178 回閲覧されました
みなさんこんにちは、jonioです。
Laravelでブログサイトを作ってテーブルに記事の投稿日を設定するカラムを作成しました。

そしてbladeで下記のコードを記述したらエラーになりました。
{{ $post->publish_date->format('Y年n月j日') }}
エラー内容は下記になります。

解決できましたが次に同じことをした時にすぐ対処できるようにこの記事を残します。
原因はデータ型
「publish_date」カラムは日付用のカラムなのですが作成した時にデータ型をtimestampにしました。
下記はマイグレーションファイルです。
$table->timestamp('publish_date');
データ型を「timestamp」にすると日付が「string」として扱われるみたいです。
だからbladeで下記の記述をすると「string」型では「->format」を使えないのでエラーになりました。
{{ $post->publish_date->format('Y年n月j日') }}
対応
多分一番簡単な方法は型を「datetime」型に変換すればいいです。
だからテーブルの「publish_date」カラムを使用するモデルで型の変換します。
今回使っているモデルはPostモデルですがそこに下記の記述を追加します。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
//ここから追加
protected $casts = [
'publish_date' => 'datetime'
];
//ここまで追加
}
16行目の「publish_date」はテーブルのカラム名で「datetime」はデータ型です。
これでbladeに下記の記述をしてもエラーは出ません。
{{ $post->publish_date->format('Y年n月j日') }}