Используйте DISTINCT в методе Laravel withCount()

С красноречивым 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), но это не работает.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
0
3 105
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
User::withCount('views', function($query) {
    $query->select(DB::raw('count(distinct(ip))'));
})->get();

Кажется, это не работает с Laravel 8.x

Juan Lago 06.09.2021 10:22

Решение для Laravel 8.x

User::withCount(['views as views_count' => function($query) {
    $query->select(DB::raw('count(distinct(ip))'));
}])->get();

Примечание. Не используйте selectRaw.

Другие вопросы по теме