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());
});
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

认真看文档应该不会有这种问题吧


资源集合

如果你要返回一个资源集合或一个分页响应,你应该在路由或控制器中创建资源实例时使用你的资源类提供的 collection 方法:

use App\Http\Resources\UserResource;
use App\Models\User;

Route::get('/users', function () {
    return UserResource::collection(User::all());
});

当然了,使用如上方法你将不能添加任何附加的元数据和集合一起返回。如果你需要自定义资源集合响应,你需要创建一个专用的资源来表示集合:

php artisan make:resource UserCollection
4个月前 评论
肌无力猛男 (楼主) 4个月前
肌无力猛男 (楼主) 4个月前
讨论数量: 7

不喜欢用laravel的资源 也可能是用的不好,

4个月前 评论
肌无力猛男 (楼主) 4个月前

认真看文档应该不会有这种问题吧


资源集合

如果你要返回一个资源集合或一个分页响应,你应该在路由或控制器中创建资源实例时使用你的资源类提供的 collection 方法:

use App\Http\Resources\UserResource;
use App\Models\User;

Route::get('/users', function () {
    return UserResource::collection(User::all());
});

当然了,使用如上方法你将不能添加任何附加的元数据和集合一起返回。如果你需要自定义资源集合响应,你需要创建一个专用的资源来表示集合:

php artisan make:resource UserCollection
4个月前 评论
肌无力猛男 (楼主) 4个月前
肌无力猛男 (楼主) 4个月前

起各种高大上的名称,扒开底裤一看也就那样 :joy:

4个月前 评论
肌无力猛男 (楼主) 4个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!