2016-12-17 72 views
1

我有一個ranking模塊,其中用戶可以搜索的其他用戶。結果顯示在一個表格中,對於每個結果我也想顯示用戶當前的排名位置。因此,例如,對於dav搜索時,結果可能是:計算用戶排名

-- 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);

是的,分頁的概念是好的,因爲結果可以是任何數字,所以你可以同時控制大量的查詢執行。 但是你停止關心他們執行查詢的次數,你無法控制它並且無法控制它。 所有你能做的就是一些兌付機構:

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

這店上面緩存記錄,所以如果你嘗試執行檢索緩存,而不是射擊SQL查詢數據庫的結果下一個查詢。或者你可以在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,問題是得到它似乎是你可以做什麼的位置是:'$結果=用戶::在哪裏(「名稱」,「喜歡」,「%$查詢%」) - >排序依據(「點''''desc') - > pluck('name') - > toArray();'$ position = array_search('name',$ results)+ 1;'' –