您当前的位置:首页 > laravel自定义分页方法

laravel自定义分页方法

日期:2020-10-14 08:58:16    浏览:228

基本用法

分页查询生成器结果
有几种方法可以分页项目。最简单的方法是在paginate查询生成器或雄辩查询.该方法会自动根据用户正在查看的当前页面设置适当的限制和偏移。默认情况下,当前页由 HTTP 请求上的查询字符串参数的值检测。Laravel 自动检测到此值,并自动插入分页器生成的链接中。paginatepage

在此示例中,传递给方法的唯一参数是希望显示”每页”的项数。在这种情况下,让我们指定我们要每页显示项目:paginate15

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
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 无法有效地执行使用语句的分页操作。如果需要使用带分页结果集的 ,建议您查询数据库并手动创建分页器。groupBygroupBy

“简单分页”
如果只需要在分页视图中显示简单的”下一步”和”上一个”链接,可以使用 方法执行更高效的查询。当您在呈现视图时不需要显示每个页号的链接时,这对于大型数据集非常有用:simplePaginate

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

分页雄辩结果
您还可以分页雄辩查询。在此示例中,我们将用每页项对模型进行分页。如您所看到的,语法几乎与分页查询生成器结果相同:User15

$users = App\Models\User::paginate(15);
您可以在对查询设置其他约束(如子句)后进行调用:paginatewhere

$users = User::where('votes', '>', 100)->paginate(15);
在分页 Eloquent 模型时,也可以使用 该方法:simplePaginate

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

手动创建分页器
有时,您可能希望手动创建分页实例,将其传递一个项数组。您可以根据需要创建 或 实例来做到这一点。Illuminate\Pagination\PaginatorIlluminate\Pagination\LengthAwarePaginator

类不需要知道结果集中的项总数;但是,因此,该类没有检索最后一页索引的方法。接受与 几乎相同的参数;但是,它确实需要对结果集中的项总数进行计数。PaginatorLengthAwarePaginatorPaginator

换句话说,对应于查询生成器和 Eloquent 上的 方法,而 对应于 方法。PaginatorsimplePaginateLengthAwarePaginatorpaginate

手动创建分页器实例时,应手动”切片”传递给分页器的结果数组。如果您不确定如何做到这一点,请查看array_slicePHP函数。

显示分页结果
调用 方法时,您将收到 的实例。调用 方法时,您将收到 的实例。这些对象提供了描述结果集的几种方法。除了这些帮助器方法之外,分页器实例是迭代器,可以循环为数组。因此,检索到结果后,可以显示结果并使用paginateIlluminate\Pagination\LengthAwarePaginatorsimplePaginateIlluminate\Pagination\Paginator叶片:

  1. <div class="container">
  2. @foreach ($users as $user)
  3. {{ $user->name }}
  4. @endforeach
  5. </div>
  6. {{ $users->links() }}

该方法将呈现指向结果集其余页面的链接。每个链接都已包含正确的查询字符串变量。请记住,该方法生成的 HTML 与linkspagelinks尾风 CSS 框架.

自定义分页器 URI
该方法允许您自定义分页器在生成链接时使用的 URI。例如,如果希望分页器生成链接(如 ),应传递给 方法:withPathhttp://example.com/custom/url?page=Ncustom/urlwithPath

  1. Route::get('users', function () {
  2. $users = App\Models\User::paginate(15);
  3. $users->withPath('custom/url');
  4. //
  5. });

追加到分页链接
您可以使用 方法追加到分页链接的查询字符串。例如,若要追加到每个分页链接,应调用 :appendssort=votesappends

{{ $users->appends(['sort' => 'votes'])->links() }}
如果希望将所有当前查询字符串值追加到分页链接,可以使用 以下方法:withQueryString

{{ $users->withQueryString()->links() }}
如果要将”哈希片段”追加到分页器的 URL 中,可以使用 该方法。例如,要追加到每个分页链接的末尾,请对 方法进行以下调用:fragment#foofragment

{{ $users->fragment('foo')->links() }}
调整分页链接窗口
您可以控制分页器 URL”窗口”的每一侧显示多少其他链接。默认情况下,主分页器链接的每一侧都显示三个链接。但是,您可以使用 以下方法控制此数字:onEachSide

{{ $users->onEachSide(5)->links() }}

将结果转换为 JSON
Laravel 分页器结果类实现接口协定并公开该方法,因此很容易将分页结果转换为 JSON。您还可以通过将分页器实例从路由或控制器操作返回到 JSON:Illuminate\Contracts\Support\JsonabletoJson

  1. Route::get('users', function () {
  2. return App\Models\User::paginate();
  3. });

来自分页器的 JSON 将包括元信息,如 、等。实际结果对象可通过 JSON 数组中的键获得。下面是通过从路由返回分页器实例创建的 JSON 示例:totalcurrent_pagelast_pagedata

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

自定义分页视图
默认情况下,为显示分页链接而呈现的视图与 Tailwind CSS 框架兼容。但是,如果您不使用 Tailwind,您可以自由定义自己的视图来呈现这些链接。在分页器实例上调用 方法时,将视图名称作为第一个参数传递给方法:links

{{ $paginator->links('view.name') }}

// Passing data to the view…
{{ $paginator->links('view.name', ['foo' => 'bar']) }}
但是,自定义分页视图的最简单方法是使用 以下命令将它们导出到目录:resources/views/vendorvendor:publish

php artisan vendor:publish --tag=laravel-pagination
此命令将视图放在目录中。此目录中的文件对应于默认分页视图。您可以编辑此文件以修改分页 HTML。resources/views/vendor/paginationtailwind.blade.php

如果要将其他文件指定为默认分页视图,可以使用 中的分页器和 方法:defaultViewdefaultSimpleViewAppServiceProvider

use Illuminate\Pagination\Paginator;

  1. public function boot()
  2. {
  3. Paginator::defaultView('view-name');
  4. Paginator::defaultSimpleView('view-name');
  5. }

使用引导
Laravel 包括使用引导 CSS.若要使用这些视图而不是默认 Tailwind 视图,可以调用 中的分页器方法:useBootstrapAppServiceProvider

use Illuminate\Pagination\Paginator;

  1. public function boot()
  2. {
  3. Paginator::useBootstrap();
  4. }

分页器实例方法

每个分页器实例通过以下方法提供额外的分页信息:

方法 描述
$paginator->count() 获取当前页面的项目数。
$paginator->currentPage() 获取当前页号。
$paginator->firstItem() 获取结果中第一项的结果编号。
$paginator->getOptions() 获取分页器选项。
$paginator->getUrlRange($start, $end) 创建一系列分页 URL。
$paginator->hasPages() 确定是否有足够的项目可以拆分为多个页面。
$paginator->hasMorePages() 确定数据存储中是否有更多项。
$paginator->items() 获取当前页面的项目。
$paginator->lastItem() 获取结果中最后一个项目的结果编号。
$paginator->lastPage() 获取最后可用页面的页号。(使用 时不可用。simplePaginate
$paginator->nextPageUrl() 获取下一页的 URL。
$paginator->onFirstPage() 确定分页器是否位于第一页上。
$paginator->perPage() 要显示每页的项目数。
$paginator->previousPageUrl() 获取上一页的 URL。
$paginator->total() 确定数据存储中匹配项的总数。(使用 时不可用。simplePaginate
$paginator->url($page) 获取给定页号的 URL。
$paginator->getPageName() 获取用于存储页面的查询字符串变量。
$paginator->setPageName($name) 设置用于存储页面的查询字符串变量。

Tags: php

世事无常

要有遥不可及的梦想,也要有脚踏实地的本事