16
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】DBから取得したcreated_atに->formatを使うと「Call to a member function format() on string」が出てしまう時の対処法

Last updated at Posted at 2020-07-16

現象

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_atupdate_atCarbonクラスのインスタンス(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_atupdated_atはデフォルトでDateTime型のメソッドが使えるから$dateに書いても意味がない。

余談だが、初め「これだっ!!」と思って

protected $date = [
    'created_at'
];

って書いたけど、無意味だった。

#最後に(というか余談)
QueryBuilderでも取得したデータをstring→DateTimeに変換する処理を記載すればできたと思うが、せっかくLaravelを使っているのでEloquentを使う処理にしてみた。

ちなみにデータ取得の処理はQueryBuilderで書いてたら7行だったが、Eloquentを使うとなんと1行

すげえ。

16
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?