Вы, похоже, go много противоречивых подходов, по моему мнению, когда имеете дело с большими объемами данных, пусть sql
делает как можно больше В следующем запросе вы получите все необходимые данные.
Users::join('clicks', 'clicks.user_id', '=', 'u.id')->where('clicks.updated_at', '>', '2020/02/09 20:00')->whereNotIn('users.id', [1, 3, 16, 18, 19, 20]);
Когда вы присоединяете данные таким образом, sql
будет повторять строки с каждым пользователем столько раз, сколько у них будет кликов, поэтому мы должны отказаться sh данные возвращаются с группировкой по.
...->groupBy('users.id');
Используйте агрегат, чтобы получить количество кликов, которое у них есть.
...->select('users.id', DB::raw('count(clicks.id) as clicks'));
Это заполнит только users.id и a поле называется clickks с количеством кликов. Ты должен избегать того, чтобы ты что-то делал с куском. Если внешние ключи настроены, этот запрос должен работать хорошо.
Полный запрос должен выглядеть примерно так. Вы не можете выбрать дополнительные поля из-за группы, но используя функцию агрегатов max или min, вы можете обойти это.
Users::join('clicks', 'clicks.user_id', '=', 'u.id')
->where('clicks.updated_at', '>', '2020/02/09 20:00')
->whereNotIn('users.id', [1, 3, 16, 18, 19, 20])
->groupBy('users.id')
->select('users.id', DB::raw('count(clicks.id) as clicks'))
->get();