1

Laravelフレームワーク/PHPフレームワーク全般にかなり慣れていないので、最初のプロジェクトのためにHacker Newsクローンを構築することにしました。ただし、並べ替えアルゴリズムで結果を並べ替えて結果をページ分割しようとすると、少し問題が発生しました。

コントローラ -

public function index()
{
    // tried Story::paginate(10) here instead, results in error
    $stories = Story::all();

    $stories = $stories->sortBy(function($story) 
    {
         return $story->getScore(); // returns score generated from HN algorithm
    })->reverse();

    return View::make('stories.index')->with('stories', $stories);
}

ビューは単なる「foreach($story as $story)」ループです。

上記のコードは問題なく動作しますが、ページ分割されていません。sortBy の前に paginate を呼び出すとエラーが返され (Paginator クラスには sortBy メソッドがありません)、sortBy の後に paginate を呼び出すとエラーが返されます。

では、結果をページ分割し、動的に生成されたスコアで並べ替えるにはどうすればよいでしょうか? ありがとう。

4

1 に答える 1

1

コメントが示唆しているように、ページ分割された後ではなく、ページ分割される前に並べ替えることができます (これは、可能であれば、実際に並べ替えるのではなく、SQL を使用して並べ替えることを意味します)。

とにかく、情報が不足しているため、ユースケースに何が適しているか正確にはわかりません。Paginator オブジェクトを使用して役立ついくつかの方法を次に示します。

まず、Paginator オブジェクトからアイテムを取得できます。

$stories = Story::paginate();
$models = $stories->getItems();
// And then sort them...

次に、アイテムを並べ替えてからページ番号を付け直す必要がある場合は、それも実行できます。

$stories = Story::all();
$stories->sortBy( ... );

$paginated = Paginator::make($stories, $total, $perpage);

私の解決策はどれもあなたにとって正確には機能しません-たとえば、ここの最後の例はすべてを取得し、それらを並べ替えてデータベース内のすべてのストーリーをページ付けしようとします(あなたが望むものはほとんどなく、ページ付けの目的を無効にします)。

うまくいけば、これがページネーションオブジェクトの使用方法に関する手がかりを提供してくれることを願っています。

最後に、各記事をランク付けし、ランク付けされた結果をキャッシュに保存するバックグラウンド プロセス (たとえば、cron ジョブで実行されるコマンド) を作成することをお勧めします。次に、キャッシュからストーリー ID を特定の順序で取得し、データベースからそれらを取得できます。データベース内のすべてのストーリーを読み込んでソートし、ユーザーがページをリクエストするたびにそれらのサブセットを返そうとしないでください。

それが役立つことを願っています。

于 2013-09-14T15:38:17.613 に答える