2016-05-17 7 views
2

かなり自由形式のスキーマを持つデータベースとやり取りするLaravel 5.2アプリケーションがあります。 、私はLengthAwarePaginatorにこのコレクションを押し込もするために、多数の異なる方法を試してみました水和モデルコレクションを使用したLaravelページ分割

<?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]); 
    } 
    ... 
} 

:私の代わりに、我々は当面hydrateRawで立ち往生している、まだ雄弁構文に変換されていない一つの特に危ないのクエリを持っています部分的に成功した。

私はコントローラーで、このお持ちの場合:

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

をなどのビューがあります。

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

私が正しくcurrentPage()仕事のような方法が、全体のコレクション(無改ページ)を取得します。

The docs暗黙のうちにヒントを使用してarray_slice私はそれをどうすればよいかわかりません。私が$models->toArray()と呼んでも、私はモデルを水和させていないかもしれません(できるだけキャッシュしたいので迷惑です)。

私は陪審員が私が以下に投稿した解決策を策定しましたが、私はこの状況にもう少し時間を掛けていくつもりで、できるだけ多くのロジックを可能な限り維持し、ちょっとした微調整だけでこれを動作させることができると感じています。

+0

あなたの質問に誤解があった場合は私を修正してください。ビューでは、 '$ models'であるコレクション全体ではなく、' $ paginated'オブジェクトを繰り返したいと思っています。次に、ページ単位の結果を取得し、 '$ models-> links()'を呼び出すことで、ページネーションコントロールをレンダリングします。 –

+0

それはタイプミスでした!私はページングされた$ページを越えてインタラクトしており、結果としてページングされていないコレクション全体を取得しています。 –

+0

私はあなたのコードを比較的単純な生のクエリでテストしました。(あるテーブルからいくつかのカラムを取り、それに2つのテーブルを追加しています)、それは私にとってはうまくいった、あなたの問題は実行している複雑なクエリに関連するかもしれません。 –

答えて

0

私の現在のソリューションは、私が持っているビューでは、上に示したモデルとコントローラの設定が含まれます。

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

ので、私は右のモデルインスタンスを取得しますが、ドキュメントはそのよう取り組んで改ページが表示されません私は改善の余地があるように感じる。

関連する問題