搜尋
首頁後端開發php教程[ Laravel 5.2 文档 ] 服务 -- 分页

1、简介

在其他框架中,分页是件非常痛苦的事,Laravel则使其变得轻而易举。Laravel能够基于当前页智能生成一定范围的链接,且生成的HTML兼容 Bootstrap CSS 框架。

2、基本使用

2.1 基于查询构建器分页

有多种方式实现分页,最简单的方式就是使用查询构建器或 Eloquent模型的 paginate方法。该方法基于当前用户查看页自动设置合适的偏移(offset)和限制(limit)。默认情况下,当前页通过HTTP请求查询字符串参数 ?page的值判断。当然,该值由Laravel自动检测,然后自动插入分页器生成的链接中。

让我们先来看看如何在查询上调用 paginate方法。在本例中,传递给 paginate的唯一参数就是你每页想要显示的数目,这里我们指定每页显示 15个:

<?phpnamespace App\Http\Controllers;use DB;use App\Http\Controllers\Controller;class UserController extends Controller{    /**     * 显示应用中的所有用户     *     * @return Response     */    public function index()    {        $users = DB::table('users')->paginate(15);        return view('user.index', ['users' => $users]);    }}

注意:目前,使用 groupBy的分页操作不能被Laravel有效执行,如果你需要在分页结果中使用 groupBy,推荐你手动查询数据库然后创建分页器。

简单分页

如果你只需要在分页视图中简单的显示“下一个”和“上一个”链接,可以使用 simplePaginate方法来执行该查询。在渲染包含大数据集的视图且不需要显示每个页码时非常有用:

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

2.2 基于Eloquent 模型分页

你还可以对Eloquent查询结果进行分页,在本例中,我们对 User模型进行分页,每页显示 15条记录。正如你所看到的,该语法和基于查询构建器的分页差不多:

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

当然,你可以在设置其它约束调价之后调用 paginate,比如 where子句:

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

你也可以使用 simplePaginate方法:

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

2.3 手动创建分页器

有时候你可能想要通过传递数组数据来手动创建分页实例,你可以基于自己的需求通过创建 Illuminate\Pagination\Paginator或 Illuminate\Pagination\LengthAwarePaginator实例来实现。

Paginator类不需要知道结果集中数据项的总数;然而,正因如此,该类也没有提供获取最后一页索引的方法。

LengthAwarePaginator接收参数和 Paginator几乎一样,只是,它要求传入结果集的总数。

换句话说, Paginator对应 simplePaginate方法,而 LengthAwarePaginator对应 paginate方法。

当手动创建分页器实例的时候,应该手动对传递到分页器的结果集进行“切片”,如果你不确定怎么做,查看PHP函数 array_slice。

3、在视图中显示分页结果

当你调用查询构建器或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查询字符串变量。记住, render方法生成的HTML兼容 Bootstrap CSS 框架。

注意:我们从Blade模板调用 render方法时,确保使用 {!! !!}语法以便HTML链接不被过滤。

自定义分页链接

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() !!}

如果你想要添加”哈希片段”到分页链接,可以使用 fragment方法。例如,要添加 #foo到每个分页链接的末尾,像这样调用 fragment方法:

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

更多辅助方法

你还可以通过如下分页器实例上的方法访问更多分页信息:

  • $results->count()
  • $results->currentPage()
  • $results->firstItem()
  • $results->hasMorePages()
  • $results->lastItem()
  • $results->lastPage() (使用simplePaginate时无效)
  • $results->nextPageUrl()
  • $results->perPage()
  • $results->previousPageUrl()
  • $results->total() (使用simplePaginate时无效)
  • $results->url($page)

4、将结果转化为JSON

Laravel分页器结果类实现了 Illuminate\Contracts\Support\JsonableInterface契约并实现 toJson方法,所以将分页结果转化为JSON非常简单。

你还可以简单通过从路由或控制器动作返回分页器实例将转其化为JSON:

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

从分页器转化来的JSON包含了元信息如 total,  current_page, last_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        }   ]}
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
哪些常見問題會導致PHP會話失敗?哪些常見問題會導致PHP會話失敗?Apr 25, 2025 am 12:16 AM

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

您如何在PHP中調試與會話相關的問題?您如何在PHP中調試與會話相關的問題?Apr 25, 2025 am 12:12 AM

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

如果session_start()被多次調用會發生什麼?如果session_start()被多次調用會發生什麼?Apr 25, 2025 am 12:06 AM

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

您如何在PHP中配置會話壽命?您如何在PHP中配置會話壽命?Apr 25, 2025 am 12:05 AM

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具