2017-07-27 53 views
0

我使用Laravel點亮,當我用第()方法來獲得一個結果我得到這個錯誤:Laravel DB:第()方法所帶來的迴應內容必須是一個字符串

The Response content must be a string or object implementing __toString(), "object" given.

return DB::table('todos')->where("title","your List")->first(); 

如果我用get()方法它的工作原理進行選擇:

return DB::table('todos')->where("title","your List")->get(); 

你知道什麼是錯的第一條語句?

回答

2

當你做->get(),你會得到一個Illuminate\Support\Collection對象。這個對象可以通過響應中返回,因爲它實現了一個__toString()方法:

/** 
* Convert the collection to its string representation. 
* 
* @return string 
*/ 
public function __toString() 
{ 
    return $this->toJson(); 
} 

/** 
* Get the collection of items as JSON. 
* 
* @param int $options 
* @return string 
*/ 
public function toJson($options = 0) 
{ 
    return json_encode($this->jsonSerialize(), $options); 
} 

/** 
* Convert the object into something JSON serializable. 
* 
* @return array 
*/ 
public function jsonSerialize() 
{ 
    return array_map(function ($value) { 
     if ($value instanceof JsonSerializable) { 
      return $value->jsonSerialize(); 
     } elseif ($value instanceof Jsonable) { 
      return json_decode($value->toJson(), true); 
     } elseif ($value instanceof Arrayable) { 
      return $value->toArray(); 
     } else { 
      return $value; 
     } 
    }, $this->items); 
} 

正如你所看到的,它的作用,它在整個集合轉換成JSON。

但是當你做->first()時,幕後發生的事情是Laravel做->take(1)->get()->first(),所以查詢被限制爲一行,那麼包含該行結果的集合被檢索,最後得到一個對象背部。

因此->first()調用是在幕後的集合上進行的,這意味着你不會獲得另一個集合,而是一個數據庫對象 - 可能是Illuminate\Database\Query\Builder類型,我不記得。

由於該類不執行__toString()方法,響應不知道該如何處理它。相反,你會得到一個錯誤。

通過在對象上運行json_encode()或返回json響應,您可以輕鬆地模擬相同的響應。

+0

當使用'DB'選擇單個行時,您將得到'stdClass'對象,該對象不會實現'__toString()'。 – fubar

+0

您也可以使用JSON響應。'return response() - > json(compact('todo'));' – fubar

0

@JoelHinz已經儘可能的詳盡了。但使用DB門面是好奇這個問題,我發現東西Laravel DOC有趣下Query builder's where clause

enter image description here

和調用get()返回(一個StdClass)對象的集合。由於它駐留在Laravel的集合中,因此有將其基礎屬性轉換爲String的方法。但是,當您直接從查詢生成器訪問集合中的某個項目時,則會有一個純粹的 StdClass對象,該對象不會執行__toString()(非常確定)。

我認爲同樣的情況是,如果你有一個集合,您檢索底層陣列中的一個說$collection[0]你將失去​​的Laravel的收藏_toString()實施,因爲你已經解開它,現在有純PHP數組。

此行爲只是如何開發查詢生成器。爲了讓您的查詢結果得到很好的處理,您可以使用return json_encode($query_result),return response()->json($query_result)或使用Eloquent(如果您創建了模型),即return Todo::where("title","your List")->first();

相關問題