Использовать функцию модели в запросе Laravel

#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