Pagination::make()
メソッドはLaravel 5のPaginationクラスに存在しなくなりました。
Laravel 5で手動ページ付けを機能させるための回避策はありますか?
用途を追加する必要があります:
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
そして今、あなたは使うことができます:
$paginator = new Paginator($items, $count, $limit, $page, [
'path' => $this->request->url(),
'query' => $this->request->query(),
]);
モデルオブジェクトのページ付けと同じ形式でデータを取得します。
このように手動でページ付けを作成できます
$data = DB::table('post')->skip(0)->take(20)->get();
このクラスをインスタンス化するためのかなりの方法
_ use Illuminate\Pagination\LengthAwarePaginator as Paginator;
//...
$paginator = new Paginator($items->forPage($page, $limit), $count, $limit, $page, [
'path' => Paginator::resolveCurrentPath()
]);
_
注items
はCollection
オブジェクトである必要があります。 collect(Array())
を使用してArray
をCollection
に変換します
Illuminate\Pagination\LengthAwarePaginator
の使用例:
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
public function getItems(Request $request)
{
$items = []; // get array/collection data from somewhere
$paginator = $this->getPaginator($request, $items);
// now we can treat $paginator as an array/collection
return view('some-view')->with('items', $paginator);
}
private function getPaginator(Request $request, $items)
{
$total = count($items); // total count of the set, this is necessary so the paginator will know the total pages to display
$page = $request->page ? $request->page : 1; // get current page from the request, first page is null
$perPage = 3; // how many items you want to display per page?
$offset = ($page - 1) * $perPage; // get the offset, how many items need to be "skipped" on this page
$items = array_slice($items, $offset, $perPage); // the array that we actually pass to the paginator is sliced
return new LengthAwarePaginator($items, $total, $perPage, $page, [
'path' => $request->url(),
'query' => $request->query()
]);
}
次に、some-view.blade.phpファイルで次のようになります。
@foreach($items as $item)
{{-- --}}
@endforeach
{{ $items->links() }}
https://laravel.com/docs/5.7/pagination#manually-creating-a-paginator を参照してください
public function myData($userid)
{
$data = static::get();
$result = [];
if(!empty($data)){
foreach ($data as $key => $value) {
$result[$value->type.'-'.$value->postid][] = $value;
}
}
$paginate = 10;
$page = Input::get('page', 1);
$offSet = ($page * $paginate) - $paginate;
$itemsForCurrentPage = array_slice($result, $offSet, $paginate, true);
$result = new \Illuminate\Pagination\LengthAwarePaginator($itemsForCurrentPage, count($result), $paginate, $page);
$result = $result->toArray();
return $result;
}
手動ページ付けについては、以下のコードを試してください
<?php
namespace App\Http\Controllers;
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
// use Illuminate\Pagination\Paginator;
use Illuminate\Http\Request;
use App\Product;
class MyController extends Controller
{
public function index(Request $request){
$items = Product::all();
$filter_products = []; // Manual filter or your array for pagination
foreach($items as $item){
if($item['id']>40 && $item['id']<50){
array_Push($filter_products, $item);
}
}
$count = count($filter_products); // total product for pagination
$page = $request->page; // current page for pagination
// manually slice array of product to display on page
$perPage = 5;
$offset = ($page-1) * $perPage;
$products = array_slice($filter_products, $offset, $perPage);
// your pagination
$products = new Paginator($products, $count, $perPage, $page, ['path' => $request->url(),'query' => $request->query(),]);
// use {{ $products->appends($_GET)->links() }} to dispaly your pagination
return view('index',['products' => $products]);
}
}