1. ホーム
  2. php

[解決済み] レスポンスの内容は文字列または __toString() を実装したオブジェクトでなければならず、 psql に移行した後に "boolean" が与えられる。

2022-02-08 09:54:50

質問

LaravelアプリをMySQLからpSQLに移行した途端。このエラーが出続けています。

レスポンスの内容は、文字列または __toString(), "boolean" を実装したオブジェクトが指定されている必要があります。

私のプロモーションを返すAPIがあります。

http://localhost:8888/api/promotion/1

public function id($id){
    $promotion = Promotion::find($id);
    dd($promotion); //I got something here
    return $promotion;
}

以前は私のプロモーションが返されていましたが、今はエラーが返されています。


dd($promotion)です。

I got 

Promotion {#410 ▼
  #table: "promotions"
  #connection: null
  #primaryKey: "id"
  #perPage: 15
  +incrementing: true
  +timestamps: true
  #attributes: array:16 [▼
    "id" => 1
    "cpe_mac" => "000D6721A5EE"
    "name" => "qwrqwer"
    "type" => "img_path"
    "status" => "Active"
    "heading_text" => "qwerq"
    "body_text" => "werqwerqw"
    "img" => stream resource @244 ▶}
    "img_path" => "/images/promotion/1/promotion.png"
    "video_url" => ""
    "video_path" => ""
    "account_id" => 1001
    "img_url" => ""
    "footer_text" => "qwerqwerre"
    "created_at" => "2016-08-04 10:53:57"
    "updated_at" => "2016-08-04 10:53:59"
  ]
  #original: array:16 [▶]
  #relations: []
  #hidden: []
  #visible: []
  #appends: []
  #fillable: []
  #guarded: array:1 [▶]
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  #morphClass: null
  +exists: true
  +wasRecentlyCreated: false
}


コンテンツ

__ この件に関するヒントや提案があれば、とても助かります。

解決方法は?

TL;DR

戻るだけ response()->json($promotion) は、この問題の問題を解決しません。 $promotion はEloquentオブジェクトで、Laravelはこれを自動的にjson_encodeして応答します。jsonエンコードに失敗しているのは img プロパティは PHP のストリームリソースであり、エンコードすることはできません。

詳細

コントローラから何を返しても、Laravelは文字列に変換しようとします。オブジェクトを返した場合、そのオブジェクトの __toString() マジックメソッドが呼び出され、変換が行われます。

したがって、単に return $promotion をコントローラアクションから呼び出すと、Laravel は __toString() を表示するための文字列に変換します。

その上で Model , __toString() コール toJson() の結果を返します。 json_encode . したがって json_encode が返されます。 false つまり、エラーが発生しているのです。

あなたの dd は、あなたの img 属性は stream resource . json_encode をエンコードすることはできません。 resource ということで、これが失敗の原因になっていると思われます。そのため、おそらくこれが失敗の原因です。 img 属性に $hidden プロパティから削除します。 json_encode .

class Promotion extends Model
{
    protected $hidden = ['img'];

    // rest of class
}