大田区から発信するゆるゆる日記

主にITエンジニアに関する備忘録日記。たまに趣味も。何か不備があればコメント頂けると幸いです。Twitterアカウント https://twitter.com/ryuzan03

【Laravelエラー】could not be converted to string

※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂ける場合は自己責任でお願いします。

【目次】

 

背景

hasmany関係のモデルで、親から全ての子ドキュメントを取得しようとした時にエラーが発生しました。

 

could not be converted to string

 

読み解いていきます。

 

【could not be converted to string】

状況

・UserテーブルとPostテーブルがある

・1人のUserは複数のPostと紐づいている

 関係①User hasmany Posts

 関係②Post belongs to User

・findメソッドを使って、Userが保持している複数のPostを取得しようとしている

 

したいこと

1人のUserが保持している複数のPostを取得したい

 

コード

UserController.php

public function show(string $userId){
return User::find($userId)->posts();
}

 

エラーコード

Object of class Jenssegers\Mongodb\Relations\HasMany could not be converted to string

⇨ (直訳)hasmanyオブジェクトを文字列に変換できませんでした

 

考察

コントローラは、戻り値として値を全て文字列(JSON)に変換し返すようになっている。

Eloquent:シリアライズ 5.6 Laravel

 

リレーションメソッドであるhasmanyメソッドは、hasmanyオブジェクトを返す。
リレーションメソッドのposts()を実行すると、UserとPostの関係性に関する情報をhasmanyオブジェクトとして取得することになります。あくまでも情報を返すので、文字列に変換することはできません。

 

->posts とした場合は、コレクションのPostモデルオブジェクトを返します。これは動的プロパティを呼び出しているからです。

さらに、コントローラはこのオブジェクトを文字列のJSONに変換し返します。

Eloquent:リレーション 5.6 Laravel

 

解決策

UserController.php

public function show(string $userId){
return User::find($userId)->posts;
}

もしくは、

public function show(string $userId){
return User::find($userId)->posts()->get();
}

// 上記のpostsの中身は、posts()->get()です。

 

参考

素晴らしい記事に感謝いたします。

php - Laravel hasMany method not working - Stack Overflow

【Laravel】EagerLoadまとめ。動的プロパティとEloquentリレーションの違いなど - Qiita