Laravelを使ったページネーション


Laravelを使ってページネーションする場合  
paginate()メソッドを使うのですが毎回  
件数を取得するSQLと結果を取得するSQLの二つが実行されます。  
paginate()メソッドはどんな仕組みになっているのでしょうか？




<https://github.com/laravel/framework/blob/eddc5a1995e697f0d9fa703ca03776fdcee96c78/src/Illuminate/Database/Query/Builder.php#L1922>

[code]

    public function paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null)
    {
        $page = $page ?: Paginator::resolveCurrentPage($pageName);
        $total = $this->getCountForPagination($columns);
        $results = $total ? $this->forPage($page, $perPage)->get($columns) : collect();
        return $this->paginator($results, $total, $perPage, $page, [
            'path' => Paginator::resolveCurrentPath(),
            'pageName' => $pageName,
        ]);
    }
    
[/code]

まず、全レコード数`$total`を取得しています(件数を取得するSQL)。  
1ページ当たりの行数`$perPage`が決まっているので、全ページ数が分かります。  
今回表示しようとしているページ番号から、取得したい行が分かり、ページに表示するレコード一覧を取得しています。（ちょっと斜め読みしただけなので不正確かもしれません）

この仕組みはページネーションを実現しているフレームワークは共通しているはずです。

