src/Paginator/Beauty/Master/MasterPaginator.php line 28

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\Paginator\Beauty\Master;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Knp\Component\Pager\Pagination\PaginationInterface;
  6. use Knp\Component\Pager\PaginatorInterface;
  7. use Slivki\Entity\BeautyMaster;
  8. use Slivki\Entity\GeoLocation;
  9. use Slivki\Message\Query\Beauty\Category\GetMastersWithFilterQuery as GetMastersWithFilterQueryForCategory;
  10. use Slivki\Message\Query\Beauty\Offer\GetMastersWithFilterQuery as GetMastersWithFilterQueryForOffer;
  11. final class MasterPaginator implements MasterPaginatorInterface
  12. {
  13.     private EntityManagerInterface $entityManager;
  14.     private PaginatorInterface $paginator;
  15.     public function __construct(
  16.         EntityManagerInterface $entityManager,
  17.         PaginatorInterface $paginator
  18.     ) {
  19.         $this->entityManager $entityManager;
  20.         $this->paginator $paginator;
  21.     }
  22.     public function findAllMasterForOfferQueryByFilter(GetMastersWithFilterQueryForOffer $query): PaginationInterface
  23.     {
  24.         $queryBuilder $this->entityManager->createQueryBuilder();
  25.         $expr $queryBuilder->expr();
  26.         $locationIdsSubQuery $this->entityManager->createQueryBuilder()
  27.             ->addSelect('gl.ID')
  28.             ->from(GeoLocation::class, 'gl')
  29.             ->innerJoin('gl.offers''o')
  30.             ->andWhere($expr->eq('o.ID'':offerId'));
  31.         $queryBuilder
  32.             ->addSelect('bm')
  33.             ->from(BeautyMaster::class, 'bm')
  34.             ->innerJoin('bm.locations''l')
  35.             ->andWhere($expr->in('l.ID'$locationIdsSubQuery->getDQL()))
  36.             ->andWhere($expr->isNull('bm.position'))
  37.             ->addGroupBy('bm.id')
  38.             ->addOrderBy($expr->asc('bm.id'))
  39.             ->setParameter('offerId'$query->getOfferId());
  40.         if (null !== $query->getLevel()) {
  41.             $queryBuilder
  42.                 ->andWhere($expr->eq('bm.level'':level'))
  43.                 ->setParameter('level'$query->getLevel());
  44.         }
  45.         return $this->paginator->paginate($queryBuilder->getQuery(), $query->getPage(), $query->getPerPage());
  46.     }
  47.     public function findAllMasterForCategoryQueryByFilter(GetMastersWithFilterQueryForCategory $query): PaginationInterface
  48.     {
  49.         $queryBuilder $this->entityManager->createQueryBuilder();
  50.         $expr $queryBuilder->expr();
  51.         $queryBuilder
  52.             ->addSelect('bm')
  53.             ->addSelect('RAND() as HIDDEN rand')
  54.             ->from(BeautyMaster::class, 'bm')
  55.             ->innerJoin('bm.categories''c')
  56.             ->innerJoin('bm.locations''l')
  57.             ->innerJoin('l.offers''o')
  58.             ->andWhere($expr->eq('c.ID'':categoryId'))
  59.             ->andWhere($expr->eq('o.active'':offerActive'))
  60.             ->andWhere($expr->eq('o.hidden'':offerHidden'))
  61.             ->andWhere($expr->between('current_timestamp()''o.activeSince''o.activeTill'))
  62.             ->andWhere($expr->isNull('bm.position'))
  63.             ->addOrderBy($expr->asc('rand'))
  64.             ->setParameters([
  65.                 'categoryId' => $query->getCategoryId(),
  66.                 'offerActive' => true,
  67.                 'offerHidden' => false,
  68.             ]);
  69.         if (null !== $query->getLevel() && $query->getLevel() > 0) {
  70.             $queryBuilder->andWhere($expr->eq('bm.level'':level'))
  71.                 ->setParameter('level'$query->getLevel());
  72.         }
  73.         return $this->paginator->paginate($queryBuilder->getQuery(), $query->getPage(), $query->getPerPage());
  74.     }
  75. }