Pagination
- Query Builder-Paginierung
- Eloquent Paginierung wird Das Ergebnis wird umgewandelt in JSON
- Paginator-Instanzmethoden
Einführung
In anderen Frameworks kann die Paginierung mühsam sein. Der Paginator von Laravel kombiniert den Abfrage-Builder und Eloquent ORM, um eine bequeme und benutzerfreundliche Paginierung von Datenbank-Ergebnismengen zu ermöglichen. Über den Paginator generiertes HTML ist mit dem Bootstrap CSS Framework kompatibel.
Grundlegende Verwendung
Query Builder-Paginierung
Es gibt mehrere Möglichkeiten, Daten zu paginieren. Am einfachsten ist es, den Abfrage-Builder oder die paginate
-Methode der Eloquent-Abfrage zu verwenden. Die paginate
-Methode legt automatisch den entsprechenden Offset-Offset und die Grenznummer basierend auf der aktuellen Seitenzahl fest, die der Benutzer durchsucht hat. Standardmäßig wird der Abfrageparameterwert page
in der HTTP-Anfrage als Seitennummer der aktuellen Seite behandelt. Lavarel erkennt diesen Wert automatisch und fügt ihn automatisch in den vom Paginator generierten Link ein.
Im folgenden Beispiel ist der einzige Parameter, der an die Methode paginate
übergeben wird, die Anzahl der Datensätze, die Sie pro Seite anzeigen möchten. Hier geben wir an, dass wir 15
Datenstücke pro Seite anzeigen möchten:
<?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} Derzeit kann Lavarel Paging-Vorgänge mit der
groupBy
-Anweisung nicht effizient ausführen. Wenn Sie eine Ergebnismenge mitgroupBy
paginieren müssen, wird empfohlen, die Datenbank manuell abzufragen und eine Paginierung zu erstellen.
Einfache Paginierung
Wenn Sie nur die Links „nächste Seite“ und „vorherige Seite“ in Ihrer paginierten Ansicht anzeigen müssen, können Sie die verwenden simplePaginate
Methode zur Durchführung effizienterer Abfragen. Dies ist nützlich, wenn Sie viele Daten haben und beim Rendern der Ansicht nicht die Seitenzahl jeder Seite anzeigen müssen:
$users = DB::table('users')->simplePaginate(15);
Eloquente Paginierung
Sie können auch eloquente Abfrageergebnisse paginieren. Im folgenden Beispiel paginieren wir das User
-Modell nach 15
Elementen pro Seite. Wie Sie sehen können, ist die Syntax im Wesentlichen dieselbe wie bei der Paginierung des Abfrage-Builders:
$users = App\User::paginate(15);
Sie können auch andere Einschränkungen wie paginate
-Klauseln in der Abfrage festlegen, bevor Sie where
aufrufen:
$users = User::where('votes', '>', 100)->paginate(15);
Kann auch in der eloquenten Paginierung verwendet werdensimplePaginate
Methode:
$users = User::where('votes', '>', 100)->simplePaginate(15);
Paginierung manuell erstellen
Manchmal möchten Sie die Paginierung möglicherweise manuell erstellen und ihr einen Array-Satz übergeben. Dies kann erreicht werden, indem Sie je nach Bedarf eine Instanz von IlluminatePaginationPaginator
oder IlluminatePaginationLengthAwarePaginator
erstellen. Die Klasse .
Paginator
muss nicht die Gesamtzahl der Ergebnismengen kennen, diese Klasse hat jedoch keine Möglichkeit, den Index der letzten Seite zu kennen. LengthAwarePaginator
akzeptiert fast die gleichen Argumente wie Paginator
, zählt jedoch die Gesamtzahl der Ergebnismenge.
Mit anderen Worten, Paginator
entspricht der simplePaginate
-Methode des Abfrage-Builders oder von Eloquent, und LengthAwarePaginator
entspricht der paginate
-Methode.
{note} Wenn Sie eine Paging-Instanz manuell erstellen, müssen Sie das an die Paging-Instanz übergebene Ergebnisarray manuell „ausschneiden“. Wenn Sie sich diesbezüglich nicht sicher sind, sehen Sie sich bitte die Funktion array_slice von PHP an.
Ergebnismenge anzeigen
Wenn Sie die paginate
-Methode aufrufen, erhalten Sie die IlluminatePaginationLengthAwarePaginator
Instanz. Rufen Sie die Methode simplePaginate
auf und rufen Sie die Instanz IlluminatePaginationPaginator
ab. Diese Objekte bieten verschiedene Methoden zum Analysieren von Ergebnismengen. Zusätzlich zu diesen Hilfsmethoden werden Pager-Instanzen zu Iteratoren zusammengefasst, die wie Arrays durchlaufen werden können. Wenn die Ergebnisse vorliegen, können Sie daher Blade verwenden, um Daten anzuzeigen und Paging-Links zu rendern:
<div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> {{ $users->links() }}
links
-Methode zum Rendern von Links zu den verbleibenden Seiten im Ergebnissatz. Jeder Link enthält die URL-Variable page
. Denken Sie daran, dass links
generiertes HTML mit dem Bootstrap CSS-Framework kompatibel ist. Mit der Methode
Benutzerdefinierter Paginator-URI
withPath
können Sie den URI beim Generieren von Paginierungslinks anpassen. Wenn Sie beispielsweise einen Paginierungslink wie http://example.com/custom/url?page=N
generieren möchten, übergeben Sie einfach den Parameter custom/url
an die Methode withPath
:
Route::get('users', function () { $users = App\User::paginate(15); $users->withPath('custom/url'); // });
Hängen Sie die Parameter an den Paginierungslink an
Sie können die Methode appends
verwenden, um Abfrageparameter zum Paging-Link hinzuzufügen. Um beispielsweise sort=votes
zu jedem Seitenlink hinzuzufügen, rufen Sie einfach appends
auf:
{{ $users->appends(['sort' => 'votes'])->links() }}
Wenn Sie der Paginator-URL ein „Hash-Fragment“ hinzufügen möchten, können Sie die Methode fragment
verwenden. Um beispielsweise #foo
zu jedem Seitenlink hinzuzufügen, rufen Sie einfach die fragment
-Methode wie folgt auf:
{{ $users->fragment('foo')->links() }}
Größe des Paginierungs-Linkfensters ändern
Sie können steuern, wie viele zusätzliche Links auf jeder Seite des „Fensters“ des Paginators angezeigt werden. Standardmäßig werden auf jeder Seite des Haupt-Paginierungslinks drei Links angezeigt. Dieser Wert kann mit der Methode onEachSide
geändert werden:
{{ $users->onEachSide(5)->links() }}
Ergebnis in JSON konvertieren
Laravel-Paginator Klasse Implementierte den Schnittstellenvertrag IlluminateContractsSupportJsonable
und stellte toJson
bereit Methode zur bequemen Konvertierung paginierter Ergebnisse in JSON. Es kann auch in JSON konvertiert werden, indem eine Paginator-Instanz von einer Routen- oder Controller-Aktion zurückgegeben wird:
Route::get('users', function () { return App\User::paginate(); });
Das JSON vom Paginator enthält Metadateninformationen wie total
, current_page
, last_page
usw. . Das eigentliche Ergebnisobjekt wird über den Schlüssel data
des JSON-Arrays bereitgestellt. Hier ist ein Beispiel für die Erstellung von JSON durch Zurückgeben einer Paginator-Instanz von einer Route:
{ "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":[ { // 结果集对象 }, { // 结果集对象 } ] }
Benutzerdefinierte Paginierungsansicht
Das Rendern von Ansichten zur Anzeige paginierter Links ist standardmäßig mit dem Bootstrap-CSS-Framework kompatibel. Wenn Sie Bootstrap nicht verwenden, können Sie Ihre eigene Ansicht anpassen, um diese Links darzustellen. Wenn Sie die links
-Methode einer Paginator-Instanz aufrufen, übergeben Sie ihr den Ansichtsnamen als erstes Argument:
{{ $paginator->links('view.name') }} // Passing data to the view... {{ $paginator->links('view.name', ['foo' => 'bar']) }}
Der einfachste Weg, paginierte Ansichten anzupassen, besteht darin, sie mit dem Befehl vendor:publish
an <🎜 auszugeben > Ordner: resources/views/vendor
php artisan vendor:publish --tag=laravel-paginationMit diesem Befehl werden diese Ansichten im Ordner
abgelegt. Die in diesen Ordner integrierte Datei resources/views/vendor/pagination
stellt die standardmäßige paginierte Ansicht bereit. Diese Datei kann bearbeitet werden, um den Paginierungs-HTML zu ändern. bootstrap-4.blade.php
und AppServiceProvider
des Paginators in defaultView
verwenden: defaultSimpleView
use Illuminate\Pagination\Paginator;public function boot(){ Paginator::defaultView('view-name'); Paginator::defaultSimpleView('view-name'); }
Pager-Instanzmethoden
Jede Pager-Instanz bietet die folgenden Methoden, um zusätzliche Paging-Informationen zu erhalten:
Methode | Beschreibung |
---|---|
$results->count() | Holen Sie sich den Strom Seite Datenmenge. |
$results->currentPage() | Erhalten Sie die aktuelle Seitenzahl. |
$results->firstItem() | Rufen Sie die Ergebnisnummer des ersten Datenelements im Ergebnissatz ab. |
$results->getOptions() | Holen Sie sich Paginatoroptionen. |
$results->getUrlRange($start, $end) | Erstellen Sie einen paginierten URL-Bereich. |
$results->hasMorePages() | Ob es mehrere Seiten gibt. |
$results->lastItem() | Rufen Sie die Ergebnisnummer des letzten Datenelements im Ergebnissatz ab. |
$results->lastPage() | Rufen Sie die Seitenzahl der letzten Seite ab (nicht gültig in simplePaginate ). |
$results->nextPageUrl() | Rufen Sie die URL der nächsten Seite ab. |
$results->onFirstPage() | Ob es die erste Seite ist oder nicht. |
$results->perPage() | Die Anzahl der Datenelemente pro Seite. |
$results->previousPageUrl() | Rufen Sie die URL der vorherigen Seite ab. |
$results->total() | Gesamtzahl der Daten (ungültig in simplePaginate ). |
$results->url($page) | Rufen Sie die URL der angegebenen Seite ab. |