Laravel 5.3 отличный счет, используя красноречивый вместо Query Builder

Приходите через странную проблему, где я изначально пытался

$usersWithAnswersCount = GameResult::where([ 'school_id' => null, 'season_id' => $this->season->id ]) ->groupBy('user_id') ->count(); 

Моя таблица выглядит так:

введите описание изображения здесь

Однако я возвращал результат "1" когда он должен был вернуться назад "2"

Когда я проверяю, что выполнялся запрос, было select count(*) as aggregate from game_results where (school_id is null and season_id = '1') group by user_id – который, если я запускаю непосредственно в качестве запроса mysql, возвращает обратно 2!

Таким образом, похоже, что что-то внутри красноречивого меняет мой 2 на 1 🙁

Однако, если я изменяю это в DB Query Builder и выписываю

 $usersWithAnswersCount = DB::table('game_results') ->selectRaw('count(distinct user_id) as count') ->where([ 'school_id' => null, 'season_id' => $this->season->id ]) ->first()->count; 

Я вернусь "2" что я и ожидал.

Тем не менее, я не понимаю, почему метод Eloquent терпит неудачу, и что я могу сделать, чтобы исправить это, если это возможно.

Solutions Collecting From Web of "Laravel 5.3 отличный счет, используя красноречивый вместо Query Builder"

Запрос, который вы делаете, неверен для использования, вы можете увидеть разницу.

 select count(*) as aggregate from game_results where (school_id is null and season_id = '1') group by user_id order by user_id asc; 

вернет две строки

 aggregate 1, 2 

Красноречивый выбирает первый и возвращается, который равен 1.

 select count(*) as aggregate from game_results where (school_id is null and season_id = '1') group by user_id order by user_id desc; 

вернет строки как

 agrregate 2, 1 

В этом случае в результате получается «Красноречивый».

То, что вы хотите, – это счетчик (запрос), который будет снова 2.

Как это сделать? вам нужно DISTINCT

 $usersWithAnswersCount = GameResult::where([ 'school_id' => null, 'season_id' => $this->season->id ]) ->distinct('user_id') ->count(); 

Вы можете использовать метод Laravel distinct() для получения отдельных записей из базы данных.

ОБНОВИТЬ

Вы можете попробовать следующее:

 $usersWithAnswersCount = GameResult::where([ 'school_id' => null, 'season_id' => $this->season->id ]) ->distinct('user_id') ->count(); 

Надеюсь это поможет!