em = $em; } public function buildQueryByAccompanyingPeriod(AccompanyingPeriod $period, ?DateTimeImmutable $startDate, ?DateTimeImmutable $endDate): QueryBuilder { $qb = $this->em->createQueryBuilder(); $qb->from(Calendar::class, 'c'); $andX = $qb->expr()->andX($qb->expr()->eq('c.accompanyingPeriod', ':period')); $qb->setParameter('period', $period); if (null !== $startDate) { $andX->add($qb->expr()->gte('c.startDate', ':startDate')); $qb->setParameter('startDate', $startDate); } if (null !== $endDate) { $andX->add($qb->expr()->lte('c.endDate', ':endDate')); $qb->setParameter('endDate', $endDate); } $qb->where($andX); return $qb; } public function countByAccompanyingPeriod(AccompanyingPeriod $period, ?DateTimeImmutable $startDate, ?DateTimeImmutable $endDate): int { $qb = $this->buildQueryByAccompanyingPeriod($period, $startDate, $endDate)->select('count(c)'); return $qb->getQuery()->getSingleScalarResult(); } /** * @return array|Calendar[] */ public function findByAccompanyingPeriod(AccompanyingPeriod $period, ?DateTimeImmutable $startDate, ?DateTimeImmutable $endDate, ?array $orderBy = [], ?int $offset = null, ?int $limit = null): array { $qb = $this->buildQueryByAccompanyingPeriod($period, $startDate, $endDate)->select('c'); foreach ($orderBy as $sort => $order) { $qb->addOrderBy('c.' . $sort, $order); } if (null !== $offset) { $qb->setFirstResult($offset); } if (null !== $limit) { $qb->setMaxResults($limit); } return $qb->getQuery()->getResult(); } }