laravel 基础教程 —— 分页

分页

简介

在其余框架中,分页经常是相比痛楚的。laravel 使其变的相当不难。laravel
可以按照当下页面很快的成形智能的范围链接,并且其转移的 HTML 是包容
Bootstrap CSS
framework
的。

基本效率法

对查询打造器结果开展分页

那里有二种办法来对元素举办分页。而最简便易行的法门就是透过采纳查询构造器或者
Eloquent 查询的 paginate 方法。paginate
方法会依据如今用户所走访的眼前页面来机关的装置科学的活动和出示的限定。默许的,当前页面是经过
HTTP 请求的询问字符串 ?page 来自动获取的。当然,laravel
会自动的检测到那些值,并且会自行的在变更的分页器的链接中插入合适的值。

率先,让大家来看一下在查询中调用 paginate
方法。在那些事例中,你仅要求在 paginate
方法中传送每页所急需体现的数量。让大家来安装每页呈现的数目为 15 :

<?php

namespace App\Http\Controllers;

use DB;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
  /**
   * Show all of the users for the application.
   *
   * @return Response
   */
   public function index()
   {
     $users = DB::table('users')->paginate(15);

     return view('user.index', ['users' => $users]);
   }
}

注意:目前,laravel 中使用 groupBy
语法不可能科学的进展分页操作。如果你要求动用 groupBy
来对结果进行分页,推荐您手动的举行查询和举办分页。

不难易行的分页

假若您只要求简单的突显“上一页”和“下一页”链接,你可以选用拔取
simplePaginate
方法来实施一个管用的询问。那对于一些重型的数据库在视图中不须要体现每一页的链接时更加有效:

$user = DB::table('users')->simplePaginate(15);

对 Eloquent 结果开展分页

您也足以对 Eloquent 查询的结果进行分页。我们来对 User 模型以每页呈现15 项的方式来进行分页。其语法和运用查询构造器进行分页卓殊像:

$users = App\User::paginate(15);

理所当然,你也得以优先开展别的查询以后再进行分页操作:

$users = User::where('votes', '>', 100)->paginate(15);

你同一也得以在 Eloquent 模型分页时行使 simplePaginate 方法:

$user = User::where('votes', '>', 100)->simplePaginate(15);

手动的成立分页器

有时你恐怕需求手动的创立一个分页实例,它传递项目标数组。你可以成立
Illuminate\Pagination\Paginator 或者
Illuminate\Pagination\LengthAwarePaginator 实例,这取决你的急需。

Paginator
类不必要理解结果中项目标总数量。事实上,正是因为如此,这些类并从未提供获取最后一页的不二法门。LengthAwarePaginator
类似于 Paginator
接收几乎一模一样的参数。然则,它须求在结果中包涵项目标总额目。

一派,Paginator 对应查询构造器和 Eloquent 中的 simplePaginate
方法。而 LengthAwarePaginator 对应 paginate 方法。

当手动的创建分页器实例时,你应有手动的对传递到分页器中的结果举办切开操作,即使你并不了然哪些去开展分片,请查看
PHP 的
array_slice
方法。

在视图中显得结果

当您对查询构造器或者 Eloquent 查询利用 paginate 或者 simplePaginate
方法时,你可以赢得到分页器的实例。当调用 paginate
方法时,你会拿走到一个 Illuminate\Pagination\LengthAwarePaginator
实例,当调用 simplePaginate 方法时,你会得到一个
Illuminate\Pagination\Paginator
的实例。这几个目的会提供三种艺术来描述结果集。除了那些帮衬方法,分页器本身也是一个迭代器,它可以像数组一样被循环操作。

为此,一旦你取得到了分页结果,你可以像这么在 Blade
视图中来体现和变化分页链接:

<div class="container">
  @foreach ($users as $user)
    {{ $user->name }}
  @endforeach
</div>

{{ $users->links() }}

links 方法会依照结果集来生成分页结果。对每一个链接都会自动蕴含 ?page
查询变量。使用 links 方法生成的 HTML 是合作 Bootstrap CSS 框架的。

自定义分页器 URL

setPath 方法允许你对分页器生成的链接的 URI
举行定制化。比如,你希望分页器生成类似于
http://example.com/custom/url?page=N,你可以传递 custom/url
setPath 方法:

Route::get('users', function () {
  $users = App\User::paginate(15);

  $users->setPath('custom/url');
});

扩展查询字符串到分页器链接

您可以透过动用 appends
方法来添加查询字符串到分页器链接中。比如,在分页器链接中追加
&sort=votes 查询字符串。你可以像上面一样调用 appends 方法:

{{ $users->appends(['sort' => 'votes'])->links() }}

一旦您须要在分页器的 URLs 中添加一个 hash 分段,你可以动用 fragment
方法。比如,在分页链接中添加 #foo

{{ $users->fragment('foo')->links() }}

其他援救方法

你可以调用分页器实例的上面的法子来访问额外的分页器新闻:

  • $results->count()
  • $results->currentPage()
  • $results->firstItem()
  • $results->hasMorePages()
  • $results->lastItem() (Not avaliable when using simplePaginate)
  • $results->nextPageUrl()
  • $results->perPage()
  • $results->previousPageUrl()
  • $results->total() (Not available when using simplePaginate)
  • $results->url($page)

转移结果为 JSON

laravel 的分页器类完成了
Illuminate\Contracts\Support\JsonableInterface 契约并且暴露了 toJson
方法,所以它可以分外简单的将分页结果转换为 JSON 格式。

您也得以在路由或者控制器动作中概括的回到分页器实例来进展 JSON
格式的响应:

Route::get('users', function () {
  return App\User::paginate(); 
});

分页器的 JSON 消息会蕴藏众多的元数据,比如
totalcurrent_pagelast_page 等等。而实际的结果对象集会保存在
JSON 数组的 data 键中。下边是一个从路由中回到分页器实例的响应示例:

分页器 JSON 示例

{
   "total": 50,
   "per_page": 15,
   "current_page": 1,
   "last_page": 4,
   "next_page_url": "http://laravel.app?page=2",
   "prev_page_url": null,
   "from": 1,
   "to": 15,
   "data":[
        {
            // Result Object
        },
        {
            // Result Object
        }
   ]
}

相关文章