src/Paginator/WorkExample/WorkExamplePaginator.php line 29

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\Paginator\WorkExample;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Knp\Component\Pager\Pagination\PaginationInterface;
  6. use Knp\Component\Pager\PaginatorInterface;
  7. use Slivki\Entity\WorkExample;
  8. use Slivki\Message\Query\Beauty\Offer\GetWorkExampleOfMasterQuery;
  9. use Slivki\Message\Query\WorkExample\GetWorkExamplesQuery;
  10. use function sprintf;
  11. final class WorkExamplePaginator implements WorkExamplePaginatorInterface
  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 findAllByQuery(GetWorkExamplesQuery $query): PaginationInterface
  23.     {
  24.         $queryBuilder $this->entityManager->createQueryBuilder();
  25.         $expr $queryBuilder->expr();
  26.         $currentUserPosition $query->getCurrentUserPosition();
  27.         $queryBuilder
  28.             ->addSelect('workExample')
  29.             ->addSelect(
  30.                 sprintf(
  31.                     '%s as %s',
  32.                     $currentUserPosition === null
  33.                     0
  34.                     $expr->min(
  35.                         sprintf(
  36.                             "ST_Distance(geoLocation.point, GeomFromEWKT('SRID=4326;POINT(%s %s)'))",
  37.                             $currentUserPosition->getLatitude(),
  38.                             $currentUserPosition->getLongitude(),
  39.                         ),
  40.                     ),
  41.                     WorkExamplePaginatorInterface::DISTANCE_SORT_FIELD,
  42.                 ),
  43.             )
  44.             ->from(WorkExample::class, 'workExample')
  45.             ->innerJoin('workExample.offer''offer')
  46.             ->innerJoin('workExample.geoLocations''geoLocation')
  47.             ->addGroupBy('workExample')
  48.             ->addOrderBy($query->getSortField(), $query->getSortDirection())
  49.         ;
  50.         if (null !== $query->getCategoryId()) {
  51.             $queryBuilder
  52.                 ->innerJoin('offer.categories''category')
  53.                 ->andWhere($expr->eq('category'':categoryId'))
  54.                 ->setParameter('categoryId'$query->getCategoryId())
  55.             ;
  56.         }
  57.         if (null !== $query->getOfferId()) {
  58.             $queryBuilder->andWhere($expr->eq('workExample.offer'':offerId'));
  59.             $queryBuilder->setParameter('offerId'$query->getOfferId());
  60.         }
  61.         if (null !== $query->getMinPrice()) {
  62.             $queryBuilder->andWhere($expr->gte('workExample.price'':minPrice'));
  63.             $queryBuilder->setParameter('minPrice'$query->getMinPrice());
  64.         }
  65.         if (null !== $query->getMaxPrice()) {
  66.             $queryBuilder->andWhere($expr->lte('workExample.price'':maxPrice'));
  67.             $queryBuilder->setParameter('maxPrice'$query->getMaxPrice());
  68.         }
  69.         return $this->paginator->paginate($queryBuilder->getQuery(), $query->getPage(), $query->getPerPage());
  70.     }
  71.     public function findByMaster(GetWorkExampleOfMasterQuery $query): PaginationInterface
  72.     {
  73.         $queryBuilder $this->entityManager->createQueryBuilder();
  74.         $expr $queryBuilder->expr();
  75.         $queryBuilder
  76.             ->addSelect('workExample')
  77.             ->from(WorkExample::class, 'workExample')
  78.             ->andWhere($expr->eq('workExample.beautyMaster'':masterId'))
  79.             ->setParameter('masterId'$query->getMasterId());
  80.         return $this->paginator->paginate($queryBuilder->getQuery(), $query->getPage(), $query->getPerPage());
  81.     }
  82. }