需求:分页列表

由于使用 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的限制条数再分页