Используйте DISTINCT в методе Laravel withCount () - PullRequest
0 голосов
/ 06 июля 2019

С помощью Laravel / Lumen eloquent я могу получить отношения подсчета следующим образом:

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 с отличным и счетным или групповым, но мне нужно, чтобы этот простой запрос был быстрым и простым.И если я могу легко добиться этого в сыром SQL, то я также должен как-то сделать это в Laravel.Я могу использовать какой-либо пользовательский метод eloquent, если потребуется, потому что я буду использовать этот уникальный счет во многих местах в приложениях.

Очень короткий вопрос - как сочетать сCount и Distinct?

PS Я также пытался использовать Different или groupBy на уровне отношений модели (на hasMany), но это не работает.

1 Ответ

1 голос
/ 06 июля 2019
User::withCount('views', function($query) {
    $query->select(DB::raw('count(distinct(ip))'));
})->get();
...