userRepository = $userRepository; } public function addRole() { return new Role(ActivityStatsVoter::STATS); } public function alterQuery(QueryBuilder $qb, $data) { // add select element $qb->addSelect(sprintf('IDENTITY(activity.user) AS %s', self::KEY)); // add the "group by" part $qb->addGroupBy(self::KEY); } public function applyOn(): string { return 'activity'; } public function buildForm(FormBuilderInterface $builder) { // nothing to add } public function getLabels($key, $values, $data): \Closure { // preload users at once $this->userRepository->findBy(['id' => $values]); return function($value) { if ($value === '_header') { return 'activity user'; } return $this->userRepository->find($value)->getUsername(); }; } public function getQueryKeys($data) { return [ self::KEY ]; } public function getTitle(): string { return 'Aggregate by activity user'; } }