#php #laravel #eloquent
#php #Laravel #Красноречивый
Вопрос:
Как я могу решить эту проблему, я хочу, чтобы выбрать пользователей, у которых есть участие в турнире, и я использую функцию 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 amp;amp; $tournament){
return true;
}
return false;
}
и это мои коды контроллера:
$all = User::all()
->sortByDesc('tournamentPoints')
->where('hasEnteredTournament')
->take(200);
большое спасибо
Комментарии:
1. Старайтесь избегать использования
::all()
так много… Для этого берется каждая строка из вашей базы данных и помещается в память какCollection
(PHP array wrapper в Laravel), затем каждая дополнительная функция должна ее изменятьCollection
. Это невероятно неэффективно. Сравните сUser::orderBy('tournamentPoints', 'DESC')->where(...)->limit(200)->get();
. Это тот же результат, но использует вашу базу данных вместо памяти PHP и очень эффективен в сравнении.
Ответ №1:
Поскольку вы работаете с коллекцией, вы можете использовать filter
метод :
https://laravel.com/docs/8.x/collections#method-filter
Ответ №2:
просто используйте этот способ…
$all = User::all()
->sortByDesc('tournamentPoints')
->hasEnteredTournament()
->take(200);
для получения дополнительной информации смотрите Здесь https://laravel.com/docs/8.x/eloquent#local-scopes