repository = $entityManager->getRepository(Household::class); $this->em = $entityManager; } public function countByAccompanyingPeriodParticipation(Person $person) { return $this->buildQueryByAccompanyingPeriodParticipation($person, true); } public function find($id) { return $this->repository->find($id); } public function findAll() { return $this->repository->findAll(); } public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null) { return $this->repository->findBy($criteria, $orderBy, $limit, $offset); } public function findByAccompanyingPeriodParticipation(Person $person, int $limit, int $offset) { return $this->buildQueryByAccompanyingPeriodParticipation($person, false, $limit, $offset); } public function findOneBy(array $criteria) { return $this->findOneBy($criteria); } public function getClassName() { return Household::class; } private function buildQueryByAccompanyingPeriodParticipation(Person $person, bool $isCount = false, int $limit = 50, int $offset = 0) { $rsm = new ResultSetMappingBuilder($this->em); $rsm->addRootEntityFromClassMetadata(Household::class, 'h'); if ($isCount) { $rsm->addScalarResult('count', 'count'); $sql = \strtr(self::SQL_BY_ACCOMPANYING_PERIOD_PARTICIPATION, [ '{select}' => 'COUNT(households.*) AS count', '{limits}' => '', ]); } else { $sql = \strtr(self::SQL_BY_ACCOMPANYING_PERIOD_PARTICIPATION, [ '{select}' => $rsm->generateSelectClause(['h' => 'households']), '{limits}' => "OFFSET {$offset} LIMIT {$limit}", ]); } $native = $this->em->createNativeQuery($sql, $rsm); $native->setParameters([0 => $person->getId(), 1 => $person->getId()]); if ($isCount) { return $native->getSingleScalarResult(); } return $native->getResult(); } }