Pagination
Vue de pagination personnalisée
- Méthode d'instance du paginateur
- Vue de pagination personnalisée
Introduction
Dans d'autres cadres, la pagination peut être pénible. Le paginateur de Laravel combine le générateur de requêtes et Eloquent ORM pour fournir une pagination pratique et facile à utiliser des ensembles de résultats de base de données. Le HTML généré via le paginateur est compatible avec le framework CSS Bootstrap.
Utilisation de base
Pagination du générateur de requêtes
Il existe plusieurs façons de paginer des données. Le plus simple est d'utiliser le générateur de requêtes ou la méthode
paginate
de la requête Eloquent. La méthodepaginate
définit automatiquement le décalage approprié et le numéro limite en fonction du numéro de page actuellement parcouru par l'utilisateur. Par défaut, la valeur du paramètre de requêtepage
dans une requête HTTP est traitée comme le numéro de page de la page actuelle. Lavarel détecte automatiquement cette valeur et l'insère automatiquement dans le lien généré par le paginateur.paginate
方法。paginate
方法根据用户浏览的当前页码,自动设置恰当的偏移量 offset 和限制数 limit。默认情况下,HTTP 请求中的page
查询参数值被当作当前页的页码。Lavarel 自动侦测该值,并自动将其插入到分页器生成的链接中。在下面的例子中,传递给
paginate
方法的唯一参数是你希望在每页显示的记录条数。在此处,我们指定要在每页显示15
条数据:<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\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]); } }
{note} 目前,Lavarel 无法高效地执行使用了
groupBy
语句的分页操作。如果你需要使用对使用了groupBy
的结果集分页,建议你手工查询数据库并创建分页。简单分页
如果只需要在你的分页视图中简单地显示『下一页』和『上一页』链接,你可以使用
simplePaginate
方法执行更高效地查询。这在数据很多且不需要在渲染视图时显示每页的页码时非常有用:$users = DB::table('users')->simplePaginate(15);
Eloquent 分页
你还能对 Eloquent 查询结果分页。在下面的例子中,我们将对
User
模型按每页15
条分页。如你所见,其语法与查询构造器分页基本雷同:$users = App\User::paginate(15);
你还可以在调用
paginate
之前,在查询中设置诸如where
从句的其它约束:$users = User::where('votes', '>', 100)->paginate(15);
在 Eloquent 分页中还能使用
Dans l'exemple ci-dessous, le seul paramètre passé à la méthodesimplePaginate
paginate
est le nombre d'enregistrements que vous souhaitez afficher sur chaque page. Ici, nous précisons que nous souhaitons afficher15
éléments de données par page :$users = User::where('votes', '>', 100)->simplePaginate(15);
{note} Actuellement, Lavarel ne peut pas effectuer efficacement les opérations qui utilisent le
groupBy
instruction Opération de pagination. Si vous devez paginer un jeu de résultats à l'aide degroupBy
, il est recommandé d'interroger manuellement la base de données et de créer une pagination.Pagination simple
Si vous avez seulement besoin d'afficher simplement "page suivante" et "page suivante" dans votre pagination afficher le lien de la page précédente, vous pouvez utiliser la méthodesimplePaginate
pour effectuer des requêtes plus efficaces. Ceci est utile lorsque vous avez beaucoup de données et que vous n'avez pas besoin d'afficher le numéro de page de chaque page lors du rendu de la vue :<div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> {{ $users->links() }}
🎜🎜🎜🎜🎜Pagination éloquente🎜🎜Vous pouvez également paginer les résultats de requêtes éloquentes. Dans l'exemple ci-dessous, nous allons paginer le modèleUtilisateur
par15
éléments par page. Comme vous pouvez le voir, la syntaxe est fondamentalement la même que celle de la pagination du générateur de requêtes : 🎜Route::get('users', function () { $users = App\User::paginate(15); $users->withPath('custom/url'); // });
🎜 Vous pouvez également définir d'autres contraintes telles que les clauseswhere
dans la requête avant d'appelerpaginate
: 🎜{{ $users->appends(['sort' => 'votes'])->links() }}
🎜Vous pouvez également utiliser la méthodesimplePaginate
dans la pagination Eloquent : 🎜{{ $users->fragment('foo')->links() }}
🎜🎜🎜🎜🎜🎜Créer une pagination manuellement
Parfois, vous souhaiterez peut-être créer une pagination manuellement et lui transmettre un ensemble de tableaux. Cela peut être accompli en créant une instance de
IlluminatePaginationPaginator
ouIlluminatePaginationLengthAwarePaginator
, en fonction de vos besoins. La classe .IlluminatePaginationPaginator
或IlluminatePaginationLengthAwarePaginator
实例来实现,这有赖于你的需要。.Paginator
类不需要知道结果集的总数;但是,这样一来,这个类就没办法获知最后一页的索引。LengthAwarePaginator
接受和Paginator
几乎相同的参数;不过,它会计算结果集的总数。换句话说,
Paginator
相当于 查询构造器 或 Eloquent 的simplePaginate
方法,而LengthAwarePaginator
相当于paginate
方法。{note} 在手动创建分页实例时,需要人为 “切割” 传递给分页实例的结果数组。如果你对此没有把握,请参考 PHP 的 array_slice 函数。
显示结果集
调用
paginate
方法时,会得到IlluminatePaginationLengthAwarePaginator
实例。调用simplePaginate
方法,得到的是IlluminatePaginationPaginator
实例。这些对象提供了分析结果集的几个方法。 除了这些辅助方法,分页器实例合为迭代器,可以像数组一样循环。因此,当得到结果后,可以使用 Blade 显示数据、渲染分页链接:{{ $users->onEachSide(5)->links() }}
links
方法渲染结果集中剩余页面的链接。每个链接都包含page
URL 变量。记住,links
生成的 HTML 兼容 Bootstrap CSS 框架。自定义分页器 URI
withPath
方法允许你在生成分页链接时自定义 URI 。例如,如果你想生成形如http://example.com/custom/url?page=N
的分页链接,只需要传递custom/url
参数给withPath
方法:Route::get('users', function () { return App\User::paginate(); });
附加参数到分页链接
可以使用
appends
方法,向分页链接中添加查询参数。例如,要在每页链接中添加sort=votes
,只需要这样调用appends
:{ "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":[ { // 结果集对象 }, { // 结果集对象 } ] }
如果想要向分页器 URL 添加 “哈希片段”,可以使用
fragment
方法。例如,要在每页链接中添加#foo
,只要这样调用fragment
Paginator
n'a pas besoin de connaître le nombre total d'ensembles de résultats cependant, cette classe n'a aucun moyen de connaître l'index de la dernière page ;LengthAwarePaginator
accepte presque les mêmes paramètres quePaginator
cependant, il compte le nombre total de l'ensemble de résultats ; En d'autres termes,Paginator
est équivalent au générateur de requêtes ou à la méthodesimplePaginate
d'Eloquent, etLengthAwarePaginator
est équivalent àpaginate code > méthode. 🎜
🎜{note} Lors de la création manuelle d'une instance de pagination, vous devez "couper" manuellement le tableau de résultats transmis à l'instance de pagination. Si vous n'êtes pas sûr de cela, veuillez vous référer à la fonction array_slice de PHP. 🎜
🎜🎜🎜Affichage du jeu de résultats
🎜 Lorsque la méthodepaginate
est appelée, une instanceIlluminatePaginationLengthAwarePaginator
sera obtenue. Appelez la méthodesimplePaginate
et obtenez l'instanceIlluminatePaginationPaginator
. Ces objets fournissent plusieurs méthodes pour analyser les jeux de résultats. En plus de ces méthodes d'assistance, les instances de pager sont combinées en itérateurs qui peuvent être parcourus en boucle comme des tableaux. Par conséquent, lorsque les résultats sont obtenus, vous pouvez utiliser Blade pour afficher les données et restituer les liens de pagination : 🎜{{ $paginator->links('view.name') }} // Passing data to the view... {{ $paginator->links('view.name', ['foo' => 'bar']) }}
🎜 Méthodelinks
pour restituer les liens vers les pages restantes de l'ensemble de résultats. Chaque lien contient la variable URLpage
. N'oubliez pas que le HTML généré par leslinks
est compatible avec le framework CSS Bootstrap. 🎜🎜URI de paginateur personnalisé
🎜La méthodewithPath
vous permet de personnaliser l'URI lors de la génération de liens de pagination. Par exemple, si vous souhaitez générer un lien paginé commehttp://example.com/custom/url?page=N
, passez simplement le paramètrecustom/url
à Méthode < code>withPath : 🎜php artisan vendor:publish --tag=laravel-pagination
🎜Ajouter des paramètres aux liens de pagination
🎜Vous pouvez utiliserappends code> Méthode pour ajouter des paramètres de requête aux liens de pagination. Par exemple, pour ajouter
sort=votes
à chaque lien de page, appelez simplementappends
comme ceci :🎜use Illuminate\Pagination\Paginator;public function boot(){ Paginator::defaultView('view-name'); Paginator::defaultSimpleView('view-name'); }
🎜Si vous souhaitez ajouter un "fragment de hachage" à l'URL du paginateur , Vous pouvez utiliser la méthodefragment
. Par exemple, pour ajouter#foo
à chaque lien de page, appelez simplement la méthodefragment
comme ceci : 🎜rrreee🎜🎜Redimensionner la fenêtre des liens de pagination
Vous pouvez contrôler le nombre de liens annexes affichés de chaque côté de la « fenêtre » du paginateur. Par défaut, trois liens apparaissent de chaque côté du lien de pagination principal. Cette valeur peut être modifiée à l'aide de la méthode
rrreeeonEachSide
:onEachSide
方法改变这个数值:将结果转换为 JSON
Laravel 分页器类实现了
rrreeeIlluminateContractsSupportJsonable
接口契约,提供了toJson
方法,能够方便地将分页结果转换为 JSON 。还可以通过自路由或控制器操作返回分页器实例来将其转换为 JSON :来自分页器的 JSON 将包括诸如
rrreeetotal
,current_page
,last_page
等元数据信息。实际结果对象将通过 JSON 数组的data
键提供。以下是通过自路由中返回分页器实例的方式创建 JSON 的例子:自定义分页视图
默认情况下,渲染视图以显示分页链接与 Bootstrap CSS 框架兼容。如果你不使用 Bootstrap,可以随心所欲地定制自己的视图来渲染这些链接。在调用分页器实例的
rrreeelinks
方法时,将视图名称作为传递给它的第一个参数:自定义分页视图的最简方法是使用
rrreeevendor:publish
命令将它们输出到resources/views/vendor
文件夹:此命令将在
resources/views/vendor/pagination
文件夹放置这些视图。内置在该文件夹下的bootstrap-4.blade.php
文件提供了默认的分页视图。可以编辑此文件以修改分页 HTML。如果想要定义不同的文件作为默认分页视图,需要在
AppServiceProvider
中使用分页器的defaultView
和defaultSimpleView
rrreeeConvertir les résultats en JSON
La classe de paginateur Laravel implémente le contrat d'interfaceIlluminateContractsSupportJsonable
et fournit la méthodetoJson
, qui peut facilement convertir la pagination résultats en JSON. Il peut également être converti en JSON en renvoyant une instance de pager à partir d'une action de route ou de contrôleur :rrreeeLe JSON du pager inclura des éléments tels quetotal
,current_page
, < code>last_page et d'autres informations de métadonnées. L'objet résultat réel sera fourni via la clédata
du tableau JSON. Voici un exemple de création de JSON en renvoyant une instance de pagination à partir d'une route : 🎜rrreee🎜🎜🎜🎜Vue paginée personnalisée
🎜Par défaut, le rendu de la vue pour afficher les liens paginés est compatible avec le framework CSS Bootstrap. Si vous n'utilisez pas Bootstrap, n'hésitez pas à personnaliser votre propre vue pour afficher ces liens. Lorsque vous appelez la méthodelinks
d'une instance de paginateur, transmettez-lui le nom de la vue comme premier argument : 🎜rrreee🎜Le moyen le plus simple de personnaliser une vue paginée est d'utiliservendor:publish< Le / code> les affichera dans le dossier
resources/views/vendor
: 🎜rrreee🎜Cette commande placera ces vues dans le dossierresources/views/vendor/pagination
. Le fichierbootstrap-4.blade.php
intégré à ce dossier fournit la vue paginée par défaut. Ce fichier peut être édité pour modifier la pagination HTML. 🎜🎜Si vous souhaitez définir un fichier différent comme vue de pagination par défaut, vous devez utiliser les méthodesdefaultView
etdefaultSimpleView
du paginateur dansAppServiceProvider
: 🎜rrreee 🎜🎜🎜🎜🎜🎜Méthodes d'instance de paginateur
Chaque instance de paginateur fournit les méthodes suivantes pour obtenir des informations de pagination supplémentaires :
Méthode Description $results->count()
Obtenir le nombre de données sur la page actuelle. $results->count()
获取当前页数据数量。 $results->currentPage()
获取当前页页码。 $results->firstItem()
获取结果集中第一条数据的结果编号。 $results->getOptions()
获取分页器选项。 $results->getUrlRange($start, $end)
创建分页 URL 范围。 $results->hasMorePages()
是否有多页。 $results->lastItem()
获取结果集中最后一条数据的结果编号。 $results->lastPage()
获取最后一页的页码(在 simplePaginate
中无效)。$results->nextPageUrl()
获取下一页的 URL 。 $results->onFirstPage()
当前而是否为第一页。 $results->perPage()
每页的数据条数。 $results->previousPageUrl()
获取前一页的 URL。 $results->total()
数据总数(在 simplePaginate
🎜🎜$results->currentPage()
Obtenir le numéro de page actuel. 🎜🎜🎜$results->firstItem()
Obtenir le numéro de résultat de la première donnée de l'ensemble de résultats. 🎜🎜🎜$results->getOptions()
Obtenez les options du paginateur. 🎜🎜🎜$results->getUrlRange($start, $end)
Créez une plage d'URL paginées. 🎜🎜🎜$results->hasMorePages()
S'il y a plusieurs pages. 🎜🎜🎜$results->lastItem()
Obtenir le numéro de résultat de la dernière donnée de l'ensemble de résultats. 🎜🎜🎜$results->lastPage()
Récupérer le numéro de page de la dernière page (non valide en 🎜🎜🎜simplePaginate
).$results->nextPageUrl()
Obtenez l'URL de la page suivante. 🎜🎜🎜$results->onFirstPage()
Actuel et s'il s'agit de la première page. 🎜🎜🎜$results->perPage()
Le nombre d'éléments de données par page. 🎜🎜🎜$results->previousPageUrl()
Récupérez l'URL de la page précédente. 🎜🎜🎜$results->total()
Le nombre total de données (invalide dans simplePaginate
).$results->url($page)
Obtenez l'URL de la page spécifiée.