Laravel 5 - Manual pagination

后端 未结 7 1550
情书的邮戳
情书的邮戳 2020-11-30 09:05

Pagination::make() method doesn\'t exist in Pagination class anymore in Laravel 5.

Is there a workaround to make manual pagination work in Laravel 5?

相关标签:
7条回答
  • 2020-11-30 09:38

    Example of using the 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 ?? 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()
        ]);
    }
    

    Then in some-view.blade.php file, for example:

    @foreach($items as $item)
        {{--  --}}
    @endforeach
    
    
    {{ $items->links() }}
    

    See https://laravel.com/docs/5.7/pagination#manually-creating-a-paginator

    0 讨论(0)
  • 2020-11-30 09:46

    Try below code for manual pagination

    <?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]);
        }
    }
    
    0 讨论(0)
  • 2020-11-30 09:53

    Another way of using pagination would be like this:

    public function index()
    {
        $posts = DB::table('posts')->paginate(15);
    }
    
    0 讨论(0)
  • 2020-11-30 09:56
    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;
    }
    
    0 讨论(0)
  • 2020-11-30 09:58

    Pretty way to instance this class

     use Illuminate\Pagination\LengthAwarePaginator as Paginator;
     //...
     $paginator = new Paginator($items->forPage($page, $limit), $count, $limit, $page, [
                'path'  => Paginator::resolveCurrentPath()
            ]);
    

    Note items must be a Collection Object. Use collect(Array()) to convert Array to Collection

    More informations

    0 讨论(0)
  • 2020-11-30 09:59

    You need to add use:

    use Illuminate\Pagination\LengthAwarePaginator as Paginator;
    

    and now you can use:

     $paginator = new Paginator($items, $count, $limit, $page, [
                'path'  => $this->request->url(),
                'query' => $this->request->query(),
            ]);
    

    to get data in the same format as paginating on model object;

    0 讨论(0)
提交回复
热议问题