2016-05-17 15 views
2

Ich habe eine Laravel 5.2-Anwendung, die mit einer Datenbank interagiert, die ein ziemlich freies Schema hat. Ich habe eine besonders knorrige Abfrage, die noch nicht in Eloquent Syntax umgewandelt worden, sondern wir mit hydrateRaw einstweilen stecken:Laravel Paginierung mit hydratisierten Modell-Sammlung

<?php                                                                

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
... 

class MyModel extends Model 
{ 
    /** 
    * Do some crazy stuff to get a MyModel Collect 
    * 
    * @params so many 
    * @return Collection 
    */ 
    public static function getModels($param1, $param2, $param3, $limit) 
    { 
     return static::hydrateRaw("SELECT table1.id, table2.name, table3.date from...", [$param1, $param2, $param3, $limit]); 
    } 
    ... 
} 

ich eine Reihe von verschiedenen Methoden versucht habe, diese Sammlung in ein LengthAwarePaginator Schuhanzieher, mit teilweisem Erfolg.

Wenn ich diese im Controller:

$models = MyModel::getModels(1,2,3,1000); 
$paginated = new LengthAwarePaginator($models, $models->count(), 12, 2); 

Und haben einen Blick wie:

@foreach ($paginated as $model) 
    {{ $model->name }} 
@endforech 

ich die ganze Sammlung erhalten (keine Paginierung), obwohl Methoden wie currentPage() Arbeit richtig.

The docs kryptisch Hinweis auf die Verwendung von array_slice aber ich bin mir nicht sicher, was ich damit machen soll. Wenn ich $models->toArray() rufe, könnte ich auch die Modelle nicht hydratisiert haben (was ein Ärgernis ist, weil ich gehofft hatte, soviel wie möglich zu cachen).

Ich habe eine Lösung angeklickt, die ich unten gepostet habe, aber ich würde wirklich gerne wissen, ob ich Paginierung bekommen kann, nur um zu arbeiten, weil ich noch ein paar Mal in diese Situation hineinlaufen werde um so viel Logik wie möglich aus den Ansichten herauszuhalten und nur ein Gefühl zu haben, dass eine kleine Verbesserung das zum Funktionieren bringen könnte.

+0

Bitte korrigiere mich, wenn ich deine Frage missverstanden habe, aber in der Ansicht, willst du das 'paginated' Objekt iterieren, nicht die ganze Sammlung, die' $ models' ist. Dann sollten Sie paginierte Ergebnisse erhalten und indem Sie '$ models-> links()' aufrufen, rendern Sie die Paginierungskontrollen. –

+0

Das war ein Tippfehler! Ich interagiere über $ paginiert und bekomme die gesamte, nicht paginierte Sammlung als Ergebnis. –

+0

Ich habe Ihren Code mit einer relativ einfachen rohen Abfrage getestet (nehmen Sie mehrere Spalten aus einer Tabelle und verbinden Sie zwei andere damit), und es funktionierte für mich, Ihr Problem könnte mit der komplexen Abfrage zusammenhängen, die Sie ausführen. –

Antwort

0

Meine aktuelle Lösung beinhaltet das Modell und Controller-Setup oben gezeigt, dann in der Ansicht habe ich:

@foreach ($paginated->forPage($paginated->currentPage(), $paginated->perPage()) as $model) 
    {{ $model->name }} 
@endforeach 

ich die richtigen Modellinstanzen, aber die Dokumente zeigen nicht Paginierung wie das funktioniert, so Ich glaube, es gibt Raum für Verbesserungen.