Aimless Blog

LaravelのページネーションとGETパラメータ

Tag:
laravelphppagination

Laravelのページネーション

Laravelはページネーションを簡単に実装できます。 取得したデータを1ページ20アイテムずつ表示したいなら

$datas = Data::all();

これを

$datas = Data::paginate(20);

に変更。bladeテンプレートに以下を追記

{{$datas->links()}}

これだけでページネーションを実装できます。

GETパラメータとページネーション

GETメソッドで送信した情報を元に何らかのデータの一覧を表示するページを作成すると、URLはhttp://localhost:8000/catalog?genre=fooのようになります。このページにLaravelのページネーションを実装すると、1ページ目は表示されても2ページ目以降が表示されない。

1ページ目のURLがhttp://localhost:8000/catalog?genre=Nu+gaze
2ページ目以降はhttp://localhost:8000/catalog?page=2
となってしまう。
?genre=Nu+gazeが消えてしまっているのでこれをhttp://localhost:8000/catalog?genre=Nu+gaze&page2のようにしたい。

例えば、selectで選んだデータの一覧を表示するページを作成したい場合

<form method="GET" action="/catalog">
	<select name="genre">
		<option value="" disabled selected>Choose your option</option>
		@foreach($result as $row)
		<option value="{{$row->genre}}">{{$row->genre}}</option>
		@endforeach
	</select>
	<button type="submit">ボタン</button>
</form>

routes\web.phpは

Route::get('/catalog', 'DataController@catalog');

コントローラーは

<?php

namespace App\Http\Controllers;

//use DB;
use App\Data;
use Illuminate\Http\Request;

class DataController extends Controller
{

 public function catalog(Request $request)
    {
        $genre = $request->genre;
        $lists = Data::where('genre','=',$genre)->paginate(20);
        return view('catalog',['lists'=>$lists,'genre'=>$genre]);
	}
}

bladeテンプレートのページネーションの部分は

{{$lists->links()}}

しかしこれだと2ページ目以降が正しく表示されないので、

{{$lists->appends(request()->input())->links()}}

に変更する。{{$lists->appends(request()->query())->links()}} でも可。

これで2ページ以降もhttp://localhost:8000/catalog?genre=Nu+gaze&page2のようになってきちんと表示されるようになります。

参考:stackoverflow