em->createQueryBuilder() ->select('a') ->from(Appointment::class, 'a') ->where('a.entityType = :type') ->andWhere('a.entityId = :id') ->andWhere('a.status IN (:statuses)') ->setParameter('type', $policy->getEntityType()) ->setParameter('id', $policy->getEntityId()) ->setParameter('statuses', [Appointment::STATUS_CONFIRMED, Appointment::STATUS_COMPLETED]) ->orderBy('a.slotStart', 'DESC') ->setMaxResults($size); if ($policy->getAddress() !== null) { $qb->andWhere('a.addressId = :address')->setParameter('address', $policy->getAddress()->getId()); } if ($policy->getServiceItem() !== null) { $qb->andWhere('a.serviceItem = :service')->setParameter('service', $policy->getServiceItem()); } if ($policy->getCatalogCategory() !== null) { $qb->join('a.serviceItem', 'si') ->andWhere('si.catalogCategory = :category') ->setParameter('category', $policy->getCatalogCategory()); } return $qb->getQuery()->getResult(); } }