現象
DBから取得したcreate_at
をviewファイル(blade)に表示する時に
{{ $data->created_at->format('Y/m/d')}}
上記のようにformat
メソッドで年月日(2020/07/16)の形式に変換したところ、
Call to a member function format() on string
というエラーメッセージが出た。
ちょっとハマりかけたが解決することができた&この内容の記事が見つからなかったので残しておく。
結論
Eloquent(ORM)
ではなくQueryBuilder
でDBからデータを取得をしていたことが原因。
Eloquent(ORM)
でコードを書き直したら解決!
#理由
QueryBuilder
でデータを取得した場合、取得した値は文字列になっちゃうから。
エラーメッセージである
Call to a member function format() on string
は「文字列に対してformatメソッドを使っちゃってますよ〜」という意味(だと思う)
Eloquentを使うとcreated_at
とupdate_at
はCarbon
クラスのインスタンス(DateTime型を拡張したものと書いてた)で取得することができるのでformat
メソッドが使えるというわけ。
参考:Laravel 6.x Eloquent:ミューテタ
※「日付ミューテタ」という項目に記載あり
今回は4つのテーブルからデータを取得する処理だったのでEloquentが使えないのかなと勝手に思ってQueryBuilderを使ったが、Eloquentでもできることがわかった。(しかもめっちゃ簡単w)
Modelに$dateを宣言してもダメ
Call to a member function format() on string
でググるとほとんど**「Modelファイルに$date
を宣言する」**という対処法が出ますが、この場合はそれもダメ。
というか先程も書いたがそもそもLaravelではcreated_at
とupdated_at
はデフォルトでDateTime型のメソッドが使えるから$dateに書いても意味がない。
余談だが、初め「これだっ!!」と思って
protected $date = [
'created_at'
];
って書いたけど、無意味だった。
#最後に(というか余談)
QueryBuilder
でも取得したデータをstring→DateTimeに変換する処理を記載すればできたと思うが、せっかくLaravelを使っているのでEloquentを使う処理にしてみた。
ちなみにデータ取得の処理はQueryBuilder
で書いてたら7行だったが、Eloquent
を使うとなんと1行。
すげえ。