Laravel 手动创建分页返回对象结果集
需求:分页列表
由于使用 Eloquent ORM 取出的数据不满足要求,需要进行一定的其他操作,选择手动创建分页。
Laravel 文档 提示在手动创建分页实例时,需要人为「切割」传递给分页实例的结果数组。如果你对此没有把握,请参考 PHP 的 array_slice 方法。
一开始的写法如下:
$rooms = Room::get();
$offset = ($page * $per_page) - $per_page;
$item = array_slice($rooms, ($page - 1) * $per_page, $per_page); // 分割成数组
$total = count($rooms);
$rooms = new LengthAwarePaginator($item, $total, $per_page, $page, ['path' => $request->url(), 'query' => $request->query()]);
但是我使用了 Laravel 内置的 API 资源 ,需要返回的是对象结果集,经过一番 Google ,发现有位老铁使用集合中的 slice()
方法解决了这个问题,特此记录。
$rooms = Room::get();
$offset = ($page * $per_page) - $per_page;
$total = count($rooms);
$rooms = new LengthAwarePaginator($rooms->slice($offset, $per_page), $total, $per_page, $page, ['path' => $request->url(), 'query' => $request->query()]);
return RoomResource::collection($rooms);
结果如下:
{
"data": [
{
"id": 132,
"room_name": 测试房间",
"room_style": "六房一厅",
"today_price": 0,
"head_pic": "",
"room_comment_score": "5.0"
}
],
"links": {
"first": "http://weapp.test/room-search?page=1",
"last": "http://weapp.test/room-search?page=4",
"prev": null,
"next": "http://weapp.test/room-search?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 4,
"path": "http://weapp.test/room-search",
"per_page": 10,
"to": 10,
"total": 34
}
参考
本作品采用《CC 协议》,转载必须注明作者和本文链接