在 Laravel 6.0 建立 LengthAwarePaginator 分頁器

前言

如果需要對一個 Query Builder 進行 map()transform() 等 Collection 方法,並且將修改過的資料進行分頁,可以手動建立一個 LengthAwarePaginator 分頁器。

做法

使用 getCollection() 方法可以從 Query Builder 中取得其 Collection 實例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 取得資料的 LengthAwarePaginator 實例
$bookings = \App\Booking::paginate();

// 修改資料的 Collection 實例
$transformedBookings = $bookings
->getCollection()
->transform(function ($booking) {
$booking->exchangedAmount = $booking->amount * 10000;

return $booking;
});

// 手動建立 LengthAwarePaginator 分頁器
$paginatedBookings = new \Illuminate\Pagination\LengthAwarePaginator(
$transformedBookings,
$bookings->total(),
$bookings->perPage(),
$bookings->currentPage(),
[
'path' => \Request::url(),
'query' => [
'page' => $bookings->currentPage(),
],
],
);

return $paginatedBookings;