As soon as I move my Laravel App from MySQL to pSQL. I kept getting this error.
The Response content must be a string or object implementing __toString(), “boolean” given.
I have an API that suppose to return my promotion
http://localhost:8888/api/promotion/1
public function id($id){ $promotion = Promotion::find($id); dd($promotion); //I got something here return $promotion; }
It used to return my promotion, now it return an error.
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 }
Content
__ Any hints / suggestions on this will be a huge help!
Advertisement
Answer
TL;DR
Just returning response()->json($promotion)
won’t solve the issue in this question. $promotion
is an Eloquent object, which Laravel will automatically json_encode for the response. The json encoding is failing because of the img
property, which is a PHP stream resource, and cannot be encoded.
Details
Whatever you return from your controller, Laravel is going to attempt to convert to a string. When you return an object, the object’s __toString()
magic method will be invoked to make the conversion.
Therefore, when you just return $promotion
from your controller action, Laravel is going to call __toString()
on it to convert it to a string to display.
On the Model
, __toString()
calls toJson()
, which returns the result of json_encode
. Therefore, json_encode
is returning false
, meaning it is running into an error.
Your dd
shows that your img
attribute is a stream resource
. json_encode
cannot encode a resource
, so this is probably causing the failure. You should add your img
attribute to the $hidden
property to remove it from the json_encode
.
class Promotion extends Model { protected $hidden = ['img']; // rest of class }