С красноречивым Laravel/Lumen я могу получить такие отношения счета:
User::withCount('views')->get();
это будет использовать SQL
select `users`.*, (select count(*) from `views` where `users`.`id` = `views`.`user_id`) as `views_count` from `users`
и вернуть все модели с атрибутом views_count, отлично.
Но мне нужно, чтобы эти просмотры учитывались с помощью уникального столбца IP. В этом запросе я мог бы просто заменить count(*) на count(DISTINCT ip) следующим образом:
select `users`.*, (select count(DISTINCT ip) from `views` where `users`.`id` = `views`.`user_id`) as `views_count` from `users`
и в phpMyAdmin он дает хорошие результаты. Но как добиться этого в Laravel красноречиво? Я не могу найти способ использовать пользовательский столбец для подсчета. Я могу передать массив с функцией запроса следующим образом:
User::withCount(['views' => function ($q) { // what there? }])->get();
но теперь я могу пройти только там, где условия, никак не использовать Distinct.
Я знаю, что могу сначала получить модели, а затем foreach с отдельными и count или groupby, но мне нужно, чтобы этот единственный запрос был быстрым и простым. И если я могу легко добиться этого в необработанном SQL, то я также должен как-то сделать это в Laravel. При необходимости я могу использовать какой-нибудь пользовательский красноречивый метод, потому что я буду использовать этот уникальный счетчик во многих местах в приложениях.
Итак, короткий вопрос - как совместить с Count и Distinct?
PS Я также пытался использовать отдельные или groupBy на уровне отношения модели (на hasMany), но это не работает.






User::withCount('views', function($query) {
$query->select(DB::raw('count(distinct(ip))'));
})->get();
Решение для Laravel 8.x
User::withCount(['views as views_count' => function($query) {
$query->select(DB::raw('count(distinct(ip))'));
}])->get();
Примечание. Не используйте selectRaw.
Кажется, это не работает с Laravel 8.x