Приходите через странную проблему, где я изначально пытался
$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 терпит неудачу, и что я могу сделать, чтобы исправить это, если это возможно.
Запрос, который вы делаете, неверен для использования, вы можете увидеть разницу.
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();
Надеюсь это поможет!