【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)に変換し返すようになっている。
リレーションメソッドであるhasmanyメソッドは、hasmanyオブジェクトを返す。
リレーションメソッドのposts()を実行すると、UserとPostの関係性に関する情報をhasmanyオブジェクトとして取得することになります。あくまでも情報を返すので、文字列に変換することはできません。
->posts とした場合は、コレクションのPostモデルオブジェクトを返します。これは動的プロパティを呼び出しているからです。
さらに、コントローラはこのオブジェクトを文字列のJSONに変換し返します。
解決策
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()です。
参考
素晴らしい記事に感謝いたします。