Laravel manual pagination

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라는 이름을 준 뒤
groupByday가 같은 값들을 묶었다.
이렇게 얻은 값을 get()을 통해 Collection의 slice 메소드를 통해 현재 $page$perPage로 잘라내어 $page값이 변할 때마다 $page에 맞는 값을 출력하도록 변경하였다.

이렇게 수동으로 $page 변수별로 slice해주어 Paginator에 전달해주면 nextPageUrl등 paginate를 사용했을 때 사용가능한 함수들을 사용할 수 있다.

글의 문제가 있다면 댓글을 달아 주세요.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.