resource collection 分页遇到困难啦
在使用 laravel API 资源集合进行分页时遇到点问题
class DriverResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'driving_license' => $this->driving_license,
'user' => new UserResource($this->user),
'vehicle' => new VehicleResource($this->vehicle),
'teller' => new UserResource($this->teller),
];
}
}
DriverResource::collection(Driver::paginate(2))
最终的返回结果并没有分页参数,但是实测可以传入page参数进行正确分页,没有分页参数前台也不知道具体分页信息呀,这里有什么方法解决一下,如果修改控制器return响应参数的话,是不是有点太麻烦了
'data' => DriverResource::collection($drivers),
'links' => [
'first' => $drivers->url(1),
'last' => $drivers->url($drivers->lastPage()),
'prev' => $drivers->previousPageUrl(),
'next' => $drivers->nextPageUrl(),
],
'meta' => [
'current_page' => $drivers->currentPage(),
'from' => $drivers->firstItem(),
'last_page' => $drivers->lastPage(),
'path' => $drivers->path(),
'per_page' => $drivers->perPage(),
'to' => $drivers->lastItem(),
'total' => $drivers->total(),
],
不知道大家有什么更好的方式🧐
已解决
开始一直没理解这里到底什么意思 最后没办法了跟着创建了另一个资源 就可以处理分页参数了 学习的路程任重而道远😢
资源集合
如果你返回的是资源集合或分页响应,你应该在路由或控制器中创建资源实例时使用资源类提供的 collection
方法:
use App\Http\Resources\UserResource;
use App\Models\User;
Route::get('/users', function () {
return UserResource::collection(User::all());
});
请注意,这种方式不允许在你的集合中添加任何可能需要返回的自定义元数据。如果你想要自定义资源集合响应,你可以创建一个专用的资源来表示集合:
php artisan make:resource UserCollection
资源集合类一旦生成,你就可以轻松定义应包含在响应中的任何元数据:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UserCollection extends ResourceCollection
{
/**
* 将资源集合转换为数组。
*
* @return array<int|string, mixed>
*/
public function toArray(Request $request): array
{
return [
'data' => $this->collection,
'links' => [
'self' => 'link-value',
],
];
}
}
资源集合定义好后,可以从路由或控制器返回它:
use App\Http\Resources\UserCollection;
use App\Models\User;
Route::get('/users', function () {
return new UserCollection(User::all());
});
认真看文档应该不会有这种问题吧
资源集合
如果你要返回一个资源集合或一个分页响应,你应该在路由或控制器中创建资源实例时使用你的资源类提供的
collection
方法:当然了,使用如上方法你将不能添加任何附加的元数据和集合一起返回。如果你需要自定义资源集合响应,你需要创建一个专用的资源来表示集合: