*/ class ResourceOccupancyRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { parent::__construct($registry, ResourceOccupancy::class); } /** * اشغال‌های همهٔ منابع در یک بازه — **یک کوئری برای کل جستجو**، نه یکی per منبع * یا per روز. موتور جستجو این را یک بار می‌گیرد و در حافظه می‌برد. * * @param int[] $resourceIds * @return array> شناسهٔ منبع => بازه‌ها */ public function busyByResource(array $resourceIds, int $from, int $to): array { if ($resourceIds === []) { return []; } $rows = $this->createQueryBuilder('o') ->select('IDENTITY(o.resource) AS resource_id, o.startsAt AS starts_at, o.endsAt AS ends_at') ->where('o.resource IN (:ids)') ->andWhere('o.startsAt < :to') ->andWhere('o.endsAt > :from') ->setParameter('ids', $resourceIds) ->setParameter('from', $from) ->setParameter('to', $to) ->orderBy('o.startsAt', 'ASC') ->getQuery() ->getArrayResult(); $byResource = []; foreach ($rows as $row) { $byResource[(int) $row['resource_id']][] = [ 'start' => (int) $row['starts_at'], 'end' => (int) $row['ends_at'], ]; } return $byResource; } /** @return ResourceOccupancy[] */ public function findForAppointment(int $appointmentId): array { return $this->findBy(['appointmentId' => $appointmentId]); } }