LaravelのページネーションとGETパラメータ
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