Laravel에서 groupBy
와 함께 paginate을 쓸 땐 수동으로 Paginator
생성하여 사용하는 것을 권장하고 있다. [docs]
나의 경우엔 groupBy 이후에 paginagte()
함수를 실행시키면 column을 찾을 수 없다는 에러가 발생하여 어쩔수 없이 수동으로 생성해야한다.
<?php
use Illuminate\Pagination\Paginator;
// ...
public function index()
{
$page = request()->page;
$perPage = 2;
$todoItems = Auth::user()
->todos()
->select([
\DB::Raw('DATE(created_at) as day'),
\DB::Raw('COUNT(created_at) as todo_count'),
])
->groupBy('day')
->orderBy('id', 'desc')
->get()
->slice(($page - 1) * $perPage, $perPage, $perPage);
$todoDays = new Paginator(
$todoItems,
$perPage,
null,
['path' => request()->url(), 'query' => request()->query()]
);
return view('todo.index', ['todoDays' => $todoDays]);
}
수동으로 생성할땐 use Illuminate\Pagination\Paginator;
를 사용한다.
Paginator
의 파라미터는
$todoItems : array_slice 혹은 slice 메소드로 분리된 배열
$perPage : 페이지당 표시할 개수
$currentPage(null) : 현재 페이지
$option([]) : 옵션
위의 코드를 예시로 들어가는 값중 $todoItems
을 상세히 설명하면
created_at 컬럼을 Date()
함수로 “년-월-일”만 표시한 상태로 day
라는 이름을 준 뒤groupBy
로 day
가 같은 값들을 묶었다.
이렇게 얻은 값을 get()
을 통해 Collection
의 slice 메소드를 통해 현재 $page
와 $perPage
로 잘라내어 $page
값이 변할 때마다 $page
에 맞는 값을 출력하도록 변경하였다.
이렇게 수동으로 $page
변수별로 slice해주어 Paginator에 전달해주면 nextPageUrl등 paginate를 사용했을 때 사용가능한 함수들을 사용할 수 있다.