2016-12-17 55 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;'' –