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
    }

参考

Laravel的限制条数再分页

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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