Laravel 5 - 手动分页

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27213453/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 10:29:42  来源:igfitidea点击:

Laravel 5 - Manual pagination

laravelpaginationlaravel-5laravel-pagination

提问by aBhijit

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

Pagination::make()Laravel 5 中的 Pagination 类中不再存在该方法。

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

是否有解决方法可以在 Laravel 5 中进行手动分页?

回答by Marcin Nabia?ek

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;

以与模型对象分页相同的格式获取数据;

回答by Goms

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()
        ]);

Noteitemsmust be a CollectionObject. Use collect(Array())to convert Arrayto Collection

注意items必须是一个Collection对象。使用collect(Array())转换ArrayCollection

More informations

更多信息

回答by Naresh Suman

You can create manual pagination like this

您可以像这样创建手动分页

$data = DB::table('post')->skip(0)->take(20)->get();

$data = DB::table('post')->skip(0)->take(20)->get();

回答by Avishay28

Example of using the Illuminate\Pagination\LengthAwarePaginator:

使用示例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:

然后在 some-view.blade.php 文件中,例如:

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


{{ $items->links() }}

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

请参阅https://laravel.com/docs/5.7/pagination#manually-creating-a-paginator

回答by Md.Azizur Rahman

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;
}

回答by Sangeet

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]);
    }
}

回答by n31l

Another way of using pagination would be like this:

另一种使用分页的方法是这样的:

public function index()
{
    $posts = DB::table('posts')->paginate(15);
}