2016-12-17 5 views
1

私はユーザーが他のユーザーを検索できるrankingモジュールを持っています。結果は表に表示され、結果ごとにユーザーの現在のランキングの位置も表示します。したがって、たとえば、davを検索するときに、結果は次のようになります。検索結果のユーザーランキングを計算する[Laravel]

-- Position -- Points -- Name -- 
    30    2345   Dave 
    105    1650   Davy 
    965    895   Superdavy 
    1949   35   Dave123 

私の質問は:位置を計算するための最良の方法だろうか?位置は、ユーザーを注文することによって計算されます。points私は

$results = User::where('name', 'LIKE', "%$query%")->orderBy('points')->paginate(25);

を持つすべてのユーザーを取得することができますが、結果を通して、私ループとは、ランキングの位置を計算するために、ユーザーごとにデータベースに問い合わせる必要がありますか?それとも簡単な方法がありますか?検索結果に50件の検索結果が含まれていて、数秒以内に複数の検索が行われている場合、多くのデータベースクエリが発生します。

+0

ランク付け番号はどこに格納されているのか、どのように計算するのかを示してください。 –

+0

おっと、申し訳ありませんが、私は答えを更新 – Jordy

+0

位置欄は冗長ではありませんか? –

答えて

0

数万人のユーザーがいる場合は、スケジューラタスクを使用することをお勧めしますたとえば、毎時間ごとにすべてのユーザーの現在の位置を再計算します。

ない場合は、実行時に位置を計算してみてください:

$positions = User::orderBy('points', 'desc')->pluck('id')->toArray(); 

パスこの変数を表示し、表示位置にして:

{{ array_search($user->id, $positions) + 1 }} 
0

注文して上記のようにあなたはその表形式の出力を得ることができますあなたがランキングをきちんと得ることができるように、降順でポイントします。 $results = User::where('name', 'LIKE',"%$query%")->orderBy('points', 'desc')->paginate(25);

いいえ、結果は任意の数になる可能性がありますので、多くのクエリ実行を同時に制御できるため、ページ付けの概念は良好です。 しかし、クエリを実行した回数について気にすることはやめてしまいます。クエリを制御できないため、制御できません。あなたはそれではなく、データベースにSQLクエリを焼成するキャッシュの結果を取得する次のクエリを実行しようとするので、もしキャッシュ内のレコード上記

$results = User::where('name', 'LIKE',"%$query%")->orderBy('points', 'desc')->remember(50)->paginate(25);

この店舗: あなたができるすべては、いくつかのキャッシングメカニズムです。または、laravelでチャンクを使用することもできます。 DB::table('users')->where('name', 'LIKE', "%$query%")->orderBy('points', 'desc')->chunk(100, function ($users) { foreach ($users as $user) { // here you can use filters } });

これらはすべてこのページのlaravelでご覧になれます。 https://laravel.com/docs/5.3/queries

+0

しかし、検索結果の各ユーザーの順位をどのように計算すればよいですか? – Jordy

+0

OK、問題はあなたができることができると思われる位置を得ることです: '$ results = User :: where( 'name'、 'LIKE'、"%$ query% ") - > orderBy( '​​points '、' desc ') - > pluck(' name ') - > toArray(); '$ position = array_search(' name '、$ results)+ 1;' –

関連する問題