em = $em; $this->authorizationHelper = $authorizationHelper; $this->security = $security; } public function addACL(QueryBuilder $qb, string $alias = 'h'): QueryBuilder { $centers = $this->authorizationHelper->getReachableCenters( $this->security->getUser(), HouseholdVoter::SEE ); if ([] === $centers) { return $qb ->andWhere("'FALSE' = 'TRUE'"); } $qb ->join($alias . '.members', 'members') ->join('members.person', 'person') ->andWhere( $qb->expr()->in('person.center', ':centers') ) ->setParameter('centers', $centers); return $qb; } public function buildQueryByAddressReference(AddressReference $addressReference): QueryBuilder { $qb = $this->em->createQueryBuilder(); $qb ->select('h') ->from(Household::class, 'h') ->join('h.addresses', 'address') ->where( $qb->expr()->eq('address.addressReference', ':reference') ) ->setParameter(':reference', $addressReference) ->andWhere( $qb->expr()->andX( $qb->expr()->lte('address.validFrom', ':today'), $qb->expr()->orX( $qb->expr()->isNull('address.validTo'), $qb->expr()->gt('address.validTo', ':today') ) ) ) ->setParameter('today', new DateTime('today')); return $qb; } public function countByAddressReference(AddressReference $addressReference): int { $qb = $this->buildQueryByAddressReference($addressReference); $qb = $this->addACL($qb); return $qb->select('COUNT(h)') ->getQuery() ->getSingleScalarResult(); } public function findByAddressReference( AddressReference $addressReference, ?int $firstResult = 0, ?int $maxResult = 50 ): array { $qb = $this->buildQueryByAddressReference($addressReference); $qb = $this->addACL($qb); return $qb ->select('h') ->setFirstResult($firstResult) ->setMaxResults($maxResult) ->getQuery() ->getResult(); } }