當你做->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響應,您可以輕鬆地模擬相同的響應。
當使用'DB'選擇單個行時,您將得到'stdClass'對象,該對象不會實現'__toString()'。 – fubar
您也可以使用JSON響應。'return response() - > json(compact('todo'));' – fubar