Pagination


Einführung

Grundlegende Verwendung
  • Query Builder-Paginierung
  • Eloquent Paginierung
    • Paginierung manuell erstellen
    • Paginierungsergebnisse anzeigen
    wird Das Ergebnis wird umgewandelt in JSON
    • Benutzerdefinierte Seitenansicht
    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 mit groupBy 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-pagination

    Mit 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

    Wenn Sie verschiedene Dateien als Standard-Paging-Ansicht definieren möchten, müssen Sie die Methoden

    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:

    MethodeBeschreibung
    $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.
    Dieser Artikel wurde zuerst auf der Website LearnKu.com veröffentlicht.