Laravelでデータベースから取得したデータを、ページネーションを使って表示してみます。
準備
データベースからデータを取得して、一覧を表示させてみます。
テーブルは以下のような内容になっています。

app\Autumn2016.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Animation extends Model
{
protected $fillable = ['title', 'category', 'production', 'actor'];
}
app\Http\routes.php
Route::get('/list', 'AnimationController@getIndex');
app\Http\Controllers\AnimationController.php
<?php
namespace App\Http\Controllers;
use App\Autumn2016;
class AnimationController extends Controller
{
public function getIndex()
{
$data = Autumn2016::get();
return view('list.index', compact('data'));
}
}
resources\views\list\index.blade.php
@foreach($data as $item)
<div>
<div>{{{ $item->id }}}</div>
<div>{{{ $item->title }}}</div>
<div>{{{ $item->category }}}</div>
<div>{{{ $item->production }}}</div>
<div>{{{ $item->actor }}}</div>
</div>
<hr>
@endforeach
データベースから取得したデータがすべて表示されました。

ページネーションの設定
先ほどのすべて表示したコードを修正して、ページネーションを設定してみます。
app\Http\Controllers\AnimationController.php
ページネーションを設定する場合、paginate()を使います。
<?php
namespace App\Http\Controllers;
use App\Autumn2016;
class AnimationController extends Controller
{
public function getIndex()
{
$data = Autumn2016::paginate(3);
return view('list.index', compact('data'));
}
}
今回は1ページに表示される件数を3件にしました。
resources\views\list\index.blade.php
ページネーションを表示する場合、links()を使います。
@foreach($data as $item)
<div>
<div>{{{ $item->id }}}</div>
<div>{{{ $item->title }}}</div>
<div>{{{ $item->category }}}</div>
<div>{{{ $item->production }}}</div>
<div>{{{ $item->actor }}}</div>
</div>
<hr>
@endforeach
{{ $data->links() }}
3件のみ表示され、下部にページネーションが表示されました。

ページネーション部分のコードは以下のようになっています。
<ul class="pagination"><li class="disabled"><span>«</span></li> <li class="active"><span>1</span></li><li><a href="http://localhost:8000/list?page=2">2</a></li><li><a href="http://localhost:8000/list?page=3">3</a></li><li><a href="http://localhost:8000/list?page=4">4</a></li><li><a href="http://localhost:8000/list?page=5">5</a></li> <li><a href="http://localhost:8000/list?page=2" rel="next">»</a></li></ul>
ページネーションを前後移動のみにしてみます。
app\Http\Controllers\AnimationController.php
前後移動のみの場合、simplePaginate()を使います。
<?php
namespace App\Http\Controllers;
use App\Autumn2016;
class AnimationController extends Controller
{
public function getIndex()
{
$data = Autumn2016::simplePaginate(3);
return view('list.index', compact('data'));
}
}
下部のページネーションが前後移動のみになりました。

ページネーションのコードは以下のようになっています。
<ul class="pager"><li class="disabled"><span>«</span></li> <li><a href="http://localhost:8000/list?page=2" rel="next">»</a></li></ul>
ページネーションのURLを変更する
ページネーションのURLに別のパラメータを追加してみます。
resources\views\list\index.blade.php
appends()を使います。
@foreach($data as $item)
<div>
<div>{{{ $item->id }}}</div>
<div>{{{ $item->title }}}</div>
<div>{{{ $item->category }}}</div>
<div>{{{ $item->production }}}</div>
<div>{{{ $item->actor }}}</div>
</div>
<hr>
@endforeach
{{ $data->appends(['sort' => 'votes'])->links() }}
ページネーションのコードは以下のようになりました。
<ul class="pagination"><li class="disabled"><span>«</span></li> <li class="active"><span>1</span></li><li><a href="http://localhost:8000/list?sort=votes&page=2">2</a></li><li><a href="http://localhost:8000/list?sort=votes&page=3">3</a></li><li><a href="http://localhost:8000/list?sort=votes&page=4">4</a></li><li><a href="http://localhost:8000/list?sort=votes&page=5">5</a></li> <li><a href="http://localhost:8000/list?sort=votes&page=2" rel="next">»</a></li></ul>
ページネーションのURLにハッシュを追加してみます。
resources\views\list\index.blade.php
fragment()を使います。
@foreach($data as $item)
<div>
<div>{{{ $item->id }}}</div>
<div>{{{ $item->title }}}</div>
<div>{{{ $item->category }}}</div>
<div>{{{ $item->production }}}</div>
<div>{{{ $item->actor }}}</div>
</div>
<hr>
@endforeach
{{ $data->fragment('foo')->links() }}
ページネーションのコードは以下のようになりました。
<ul class="pagination"><li class="disabled"><span>«</span></li> <li class="active"><span>1</span></li><li><a href="http://localhost:8000/list?page=2#foo">2</a></li><li><a href="http://localhost:8000/list?page=3#foo">3</a></li><li><a href="http://localhost:8000/list?page=4#foo">4</a></li><li><a href="http://localhost:8000/list?page=5#foo">5</a></li> <li><a href="http://localhost:8000/list?page=2#foo" rel="next">»</a></li></ul>
その他のヘルパーメソッド
その他のヘルパーメソッドを使ってみます。
resources\views\list\index.blade.php
@foreach($data as $item)
<div>
<div>{{{ $item->id }}}</div>
<div>{{{ $item->title }}}</div>
<div>{{{ $item->category }}}</div>
<div>{{{ $item->production }}}</div>
<div>{{{ $item->actor }}}</div>
</div>
<hr>
@endforeach
<div>現在のページに表示されている件数: {{ $data->count() }}</div>
<div>現在のページ数: {{ $data->currentPage() }}</div>
<div>現在のページの最初の要素: {{ $data->firstItem() }}</div>
<div>次のページがあるかどうか: {{ $data->hasMorePages() }}</div>
<div>現在のページの最後の要素: {{ $data->lastItem() }}</div>
<div>最後のページ数: {{ $data->lastPage() }}</div>
<div>次のページのURL: {{ $data->nextPageUrl() }}</div>
<div>1ページに表示する件数: {{ $data->perPage() }}</div>
<div>前のページのURL: {{ $data->previousPageUrl() }}</div>
<div>合計件数: {{ $data->total() }}</div>
<div>指定ページのURL: {{ $data->url(4) }}</div>
2ページ目(http://localhost:8000/list?page=2)で確認すると、以下のように表示されました。

| count() | 現在のページに表示されている件数を取得。 |
|---|---|
| currentPage() | 現在のページ数を取得。 |
| firstItem() | 現在のページの最初の要素のidを取得。 |
| hasMorePages() | 次のページがあるかどうかを取得。 |
| lastItem() | 現在のページの最後の要素のidを取得。 |
| lastPage() | 最後のページ数を取得。 |
| nextPageUrl() | 次のページのURLを取得。 |
| perPage() | 1ページに表示する件数を取得。 |
| previousPageUrl() | 前のページのURを取得。L |
| total() | 合計件数を取得。 |
| url(num) | 指定ページのURLを取得。 |
結果をjson形式で取得
json形式で表示してみます。
app\Http\Controllers\AnimationController.php
<?php
namespace App\Http\Controllers;
use App\Autumn2016;
class AnimationController extends Controller
{
public function getIndex()
{
return Autumn2016::paginate(3);
}
}
以下のように出力されました、
{
"total":13,
"per_page":3,
"current_page":1,
"last_page":5,
"next_page_url":"http:\/\/localhost:8000\/list?page=2",
"prev_page_url":null,
"from":1,
"to":3,
"data":[
{
"id":1,
"title":"\u97ff\u3051\uff01\u30e6\u30fc\u30d5\u30a9\u30cb\u30a2\u30e02",
"category":"\u5c0f\u8aac",
"production":"\u4eac\u90fd\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3",
"actor":"\u9ed2\u6ca2\u3068\u3082\u3088"
},{
"id":2,
"title":"3\u6708\u306e\u30e9\u30a4\u30aa\u30f3",
"category":"\u6f2b\u753b",
"production":"\u30b7\u30e3\u30d5\u30c8",
"actor":"\u6cb3\u897f\u5065\u543e"
},{
"id":3,
"title":"\u9b54\u6cd5\u5c11\u5973\u80b2\u6210\u8a08\u753b",
"category":"\u5c0f\u8aac",
"production":"Lerche",
"actor":"\u6771\u5c71\u5948\u592e"
}
]
}
【参考サイト】
コメントが承認されるまで時間がかかります。