返回带有自定义JSON模式的分页雄辩模型


Returning paginated eloquent models with custom JSON schema?

我正在开发Laravel 4中的一个API,现在当我以JSON格式返回分页信息时,它会以这种特定格式返回:

    {
        "Photos":{
            "total":1,
            "per_page":15,
            "current_page":1,
            "last_page":1,
            "from":1,
            "to":1,
            "data":[
                {
                    "id":3,
                    "moreInfo":"..."
                }
            ]
        }
    }

但是我希望我的API以这种格式返回信息:

    {
        "total":1,
        "per_page":15,
        "current_page":1,
        "last_page":1,
        "from":1,
        "to":1,
        "Photos":[
            {
                "id":3,
                "moreInfo":"..."
            }
        ]
    }

相关代码如下:

    if (Input::has('page')) {
        $limit = (Input::get('limit')) ? Input::get('limit') : 15;
        return Response::json([
            'Photos' => $photos->paginate($limit)->toArray()
        ]);
    }

起初我没有意识到这实际上是多么简单,我尝试通过Pagination->getItems()Pagination->getCollection()获取数据。

我意识到我所要做的就是从分页中获取['data']部分。我的代码现在看起来像:

    if (Input::has('page')) {
        $limit = (Input::get('limit')) ? Input::get('limit') : 15;
        $pagedPhotos = $photos->paginate($limit);
        return Response::json([
            'total' => $pagedPhotos->getTotal(),
            'per_page' => $pagedPhotos->getPerPage(),
            'current_page' => $pagedPhotos->getCurrentPage(),
            'last_page' => $pagedPhotos->getLastPage(),
            'from' => $pagedPhotos->getFrom(),
            'to' => $pagedPhotos->getTo(),
            'Photos' => $photos->paginate($limit)->toArray()['data']
        ]);
    }

所以去掉photos组件:

return Response::json($photos->paginate($limit)->toArray())

在Laravel 9中,这是不同的工作方式,要自定义Paginator的响应,代码应该是这样的:

$myCommunityActivities = CommunityActivity::where('member_id', Auth::user()->id)->paginate(10);
$results = [
   'total' => $myCommunityActivities->total(),
   'per_page' => $myCommunityActivities->perPage(),
   'current_page' => $myCommunityActivities->currentPage(),
   'last_page' => $myCommunityActivities->lastPage(),
   'activities' => $myCommunityActivities->items()
];
return response()->json($results, 200);