【发布时间】:2020-10-14 12:14:50
【问题描述】:
我该如何解决这个问题 我想选择已经进入锦标赛的用户,并且我在我的用户模型中使用 hasEnteredTournament 函数也知道
这是用户模型:
public function scopeHasEnteredTournament($query){
$active = Order::all()
->where('user_id','=',$this->id)
->where('status','=',1)
->where('pack_id','=',3)
->where('expired_at','>',now())
->first();
$tournament = Tournament::all()
->where('status','=',1)
->where('start_at','<',now())
->where('end_at','>',now())
->first();
if($active && $tournament){
return true;
}
return false;
}
这是我的控制器代码:
$all = User::all()
->sortByDesc('tournamentPoints')
->where('hasEnteredTournament')
->take(200);
非常感谢
【问题讨论】:
-
尽量避免使用
::all()这么多...这样做会从数据库中取出每一行并将其作为Collection(Laravel 中的 PHP 数组包装器)放入内存中,然后是每个附加函数需要修改Collection。这是难以置信地低效的。与User::orderBy('tournamentPoints', 'DESC')->where(...)->limit(200)->get();进行比较。这是相同的输出,但使用的是您的数据库而不是 PHP 内存,相比之下,效率非常。