Laravel Eloquent 资源 Collection 响应
Laravel Eloquent Resource Collection response
所以我正在尝试使用资源 collection 来 return 数据表 json 信息。在我使用 collection 之前,我首先做了一个概念验证,如下所示:
public function index()
{
$clients = QueryBuilder::for(Client::class)
->allowedIncludes('accounts')
->get();
if (request()->ajax()) {
return DataTables::of($clients)->make(true);
}
return view('client.index', compact('clients'));
}
这非常有效,json 响应如下所示:
{data: [{id: "4428", number: "492501", name: "Test Client", email: "test@test.com",…},…]
draw:1
input:{view: "datatable", draw: "1",…}
recordsFiltered:2
recordsTotal:2}
然后我更新了索引调用以使用如下所示的资源 collection:
public function toArray($request)
{
switch ($request->view) {
case 'datatable':
self::withoutWrapping();
return DataTables::of($this->collection)->make(true);
}
return parent::toArray($request);
}
响应现在被放置在 "original" 属性中,并且响应中添加了一堆其他项目。我不明白为什么。它看起来像这样:
*callback: null
*charset: null
*content: <The above response is in here as a string>
*encodingOptions: 0
*statusCode: 200
*statusText: "OK"
*version: "1.0"
exception: null
headers: {}
original: <The above response is in here as an object>
我可以将数据表上的 dataSrc 设置为 original.data,它工作正常,但所有这些额外的东西是从哪里来的?我使用了一些其他资源 collections,但从未添加过所有这些东西。
更新:因为我正在寻找的一切都在 "original" 分页中断以及大多数其他数据表功能。如果我将这个 return 移回控制器,它工作正常。
所以,答案与响应类型有关。 eloquent 资源有一个名为 "toResponse" 的未记录函数,如果您的 return 将成为某种 jsonResponse,您需要修改它而不是 toArray 方法。发生的事情是我 returning 一个 JsonResponse 并且它正在将它变成一个数组并且只是 returning 那个 json 编码。
为了清楚起见,这是我的新资源:
public function toResponse($request)
{
switch ($request->view) {
case 'datatable':
self::withoutWrapping();
return DataTables::of($this->collection)->toJson();
}
return parent::toResponse($request);
}
因此,重申一下,如果您正在 return 数组或正确符合数组的内容(数据表 json 响应不符合),您将覆盖 "toArray"。如果您 return 正在 json 回复,您需要覆盖 "toResponse".
另一种选择是让您的代码从 toArray
开始,但是当您知道您将要 return 一个 json 响应时,您调用 $this->toResponse($request)
。选择是你的。
所以我正在尝试使用资源 collection 来 return 数据表 json 信息。在我使用 collection 之前,我首先做了一个概念验证,如下所示:
public function index()
{
$clients = QueryBuilder::for(Client::class)
->allowedIncludes('accounts')
->get();
if (request()->ajax()) {
return DataTables::of($clients)->make(true);
}
return view('client.index', compact('clients'));
}
这非常有效,json 响应如下所示:
{data: [{id: "4428", number: "492501", name: "Test Client", email: "test@test.com",…},…]
draw:1
input:{view: "datatable", draw: "1",…}
recordsFiltered:2
recordsTotal:2}
然后我更新了索引调用以使用如下所示的资源 collection:
public function toArray($request)
{
switch ($request->view) {
case 'datatable':
self::withoutWrapping();
return DataTables::of($this->collection)->make(true);
}
return parent::toArray($request);
}
响应现在被放置在 "original" 属性中,并且响应中添加了一堆其他项目。我不明白为什么。它看起来像这样:
*callback: null
*charset: null
*content: <The above response is in here as a string>
*encodingOptions: 0
*statusCode: 200
*statusText: "OK"
*version: "1.0"
exception: null
headers: {}
original: <The above response is in here as an object>
我可以将数据表上的 dataSrc 设置为 original.data,它工作正常,但所有这些额外的东西是从哪里来的?我使用了一些其他资源 collections,但从未添加过所有这些东西。
更新:因为我正在寻找的一切都在 "original" 分页中断以及大多数其他数据表功能。如果我将这个 return 移回控制器,它工作正常。
所以,答案与响应类型有关。 eloquent 资源有一个名为 "toResponse" 的未记录函数,如果您的 return 将成为某种 jsonResponse,您需要修改它而不是 toArray 方法。发生的事情是我 returning 一个 JsonResponse 并且它正在将它变成一个数组并且只是 returning 那个 json 编码。
为了清楚起见,这是我的新资源:
public function toResponse($request)
{
switch ($request->view) {
case 'datatable':
self::withoutWrapping();
return DataTables::of($this->collection)->toJson();
}
return parent::toResponse($request);
}
因此,重申一下,如果您正在 return 数组或正确符合数组的内容(数据表 json 响应不符合),您将覆盖 "toArray"。如果您 return 正在 json 回复,您需要覆盖 "toResponse".
另一种选择是让您的代码从 toArray
开始,但是当您知道您将要 return 一个 json 响应时,您调用 $this->toResponse($request)
。选择是你的。