Laravelの手動ページングについて

12725 ワード

Laravel手動でページングし、シーンを適用するには、ページングデータに特殊なパラメータを渡す必要があり、laravelがpaginateメソッドを持っていない場合.
   
初期データは次のとおりです.
    $data = array(       ['id'=>'1','user_id'=>2,'papaer_id'=>10],       ['id'=>'2','user_id'=>2,'papaer_id'=>11],     );
    json     :

   [     {       "id": "1",       "user_id": 2,       "papaer_id": 10     },     {       "id": "2",       "user_id": 2,       "papaer_id": 11     }  ]
ここには全部で2つのデータがあり、1ページに1つ、全部で2ページ表示するように設定しています.
まずlaravelが持っている方法を見て、私にもたらした効果を見てみましょう.
{   "total": 2,   "per_page": 1,   "current_page": 1,   "last_page": 2,   "next_page_url": "http://127.0.0.1:8999/page?page=2",   "prev_page_url": null,   "from": 1,   "to": 1,   "data": [     {       "id": 1,       "user_id": 2,       "paper_id": 10     }   ]}
このルーティングのURLなど、カスタムパラメータを追加すると、次のような効果が得られます(必要に応じてパラメータを追加します).
{
  “path”: "http://127.0.0.1:8999",  "total": 2,  "per_page": 1,  "current_page": 1,  "last_page": 2,  "next_page_url": "http://127.0.0.1:8999/page?page=2",  "prev_page_url": null,  "from": 1,  "to": 1,  "data": [    {      "id": 1,      "user_id": 2,      "paper_id": 10    }  ]}
  laravel :
#vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:480

public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
        $query = $this->toBase();

        $total = $query->getCountForPagination();

        $this->forPage(
            $page = $page ?: Paginator::resolveCurrentPage($pageName),
            $perPage = $perPage ?: $this->model->getPerPage()
        );

        return new LengthAwarePaginator($this->get($columns), $total, $perPage, $page, [
            'path' => Paginator::resolveCurrentPath(),
            'pageName' => $pageName,
        ]);
}


lengthAwarePaginator

LengthAwarePaginator , :

public function __construct($items, $total, $perPage, $currentPage = null, array $options = [])
{
        foreach ($options as $key => $value) {
            $this->{$key} = $value;
        }

        $this->total = $total;
        $this->perPage = $perPage;
        $this->lastPage = (int) ceil($total / $perPage);
        $this->path = $this->path != '/' ? rtrim($this->path, '/') : $this->path;
        $this->currentPage = $this->setCurrentPage($currentPage, $this->lastPage);
        $this->items = $items instanceof Collection ? $items : Collection::make($items);
}
 
 

, :
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;

  public function show(Request $request){
     $blogs = DB::table('blog')->where('uid',$uid)->select(); //
    
$perPage = 1; // if ($request->has('page')) { // , page , 1 $current_page = $request->input('page'); $current_page = $current_page <= 0 ? 1 :$current_page; } else { $current_page = 1; }
$item = array_slice($real, ($current_page-1)*$perPage, $perPage); // 1 $total = count($blogs); // $paginator =new LengthAwarePaginator($item, $total, $perPage, $current_page, [ 'path' => Paginator::resolveCurrentPath(), // 2 'pageName' => 'page', ]);

    return response()->json(['result'=>$paginator]) }
 
 

  注释1: array_slice(array,start,length)   从start位置,去获取length参数。结果返回一条数据

  注释2:就是设定个要分页的url地址。也可以手动通过 $paginator ->setPath(‘路径’) 设置。

 

  页面中的分页连接也是同样的调用方式 {{ $paginator->render() }}。

  注:返回得数据格式大概如下所示:

{

  “path”: "http://127.0.0.1:8999",
  "total": 2,
  "per_page": 1,
  "current_page": 1,
  "last_page": 2,
  "next_page_url": "http://127.0.0.1:8999/page?page=2",
  "prev_page_url": null,
  "from": 1,
  "to": 1,
  "data": [
    {
      "id": 1,
      "user_id": 2,
      "paper_id": 10
    }
  ]
}

 



, , 。 , 。