src/Repository/Category/CategoryRepository.php line 138

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\Repository\Category;
  4. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  5. use Doctrine\Persistence\ManagerRegistry;
  6. use Slivki\Entity\Category;
  7. use Slivki\Entity\MainMenu;
  8. use Slivki\Exception\CategoryNotFoundException;
  9. final class CategoryRepository extends ServiceEntityRepository implements CategoryRepositoryInterface
  10. {
  11.     public function __construct(ManagerRegistry $registry)
  12.     {
  13.         parent::__construct($registryCategory::class);
  14.     }
  15.     /**
  16.      * @throws CategoryNotFoundException
  17.      */
  18.     public function getById(int $id): Category
  19.     {
  20.         $category $this->findById($id);
  21.         if (!$category instanceof Category) {
  22.             throw CategoryNotFoundException::missingId($id);
  23.         }
  24.         return $category;
  25.     }
  26.     public function findById(int $id): ?Category
  27.     {
  28.         $queryBuilder $this->createQueryBuilder('category');
  29.         $expr $queryBuilder->expr();
  30.         return $queryBuilder
  31.             ->andWhere($expr->eq('category.ID'':id'))
  32.             ->setParameter('id'$id)
  33.             ->getQuery()
  34.             ->getOneOrNullResult();
  35.     }
  36.     public function findByIds(array $ids): array
  37.     {
  38.         $queryBuilder $this->createQueryBuilder('category');
  39.         $expr $queryBuilder->expr();
  40.         return $queryBuilder
  41.             ->andWhere($expr->in('category.ID'':ids'))
  42.             ->setParameter('ids'$ids)
  43.             ->getQuery()
  44.             ->getResult();
  45.     }
  46.     /**
  47.      * @return Category[]
  48.      */
  49.     public function getActiveExcludedFreeSubCategories(Category $category): array
  50.     {
  51.         return $category->getSubCategories()->filter(
  52.             static fn (Category $subCategory): bool =>
  53.                 false === $subCategory->isPast()
  54.                 && true === $subCategory->isActive()
  55.                 && \in_array(
  56.                     $subCategory->getCategoryType()->getID(),
  57.                     [Category::DEFAULT_CATEGORY_TYPECategory::SERVICE_CATEGORY_TYPE],
  58.                     true
  59.                 )
  60.                 && Category::OFFER_CATEGORY_ID === $subCategory->getDomainObjectID()
  61.         )->toArray();
  62.     }
  63.     public function findCategoryByMainMenu(MainMenu $mainMenu): ?Category
  64.     {
  65.         if (!\in_array($mainMenu->getType(), [MainMenu::TYPE_OFFER_CATEGORYMainMenu::TYPE_SALE_CATEGORY], true)) {
  66.             return null;
  67.         }
  68.         return $this->findById($mainMenu->getEntityID());
  69.     }
  70.     public function findTopActiveDefaultTypeCategoriesByCitySortedByName(array $cityIds): array
  71.     {
  72.         $qb $this->createQueryBuilder('category');
  73.         $expr $qb->expr();
  74.         return $qb
  75.             ->innerJoin('category.city''city')
  76.             ->andWhere($expr->in('city.ID'':cityIds'))
  77.             ->andWhere($expr->eq('category.active'':active'))
  78.             ->andWhere($expr->eq('category.typeID'':defaultCategoryType'))
  79.             ->andWhere($expr->eq('category.domainObjectID'':domainObjectID'))
  80.             ->andWhere('category.parents is empty')
  81.             ->setParameters([
  82.                 'cityIds' => $cityIds,
  83.                 'active' => true,
  84.                 'defaultCategoryType' => Category::DEFAULT_CATEGORY_TYPE,
  85.                 'domainObjectID' => Category::OFFER_CATEGORY_ID,
  86.             ])
  87.             ->addOrderBy($expr->asc('category.name'))
  88.             ->getQuery()
  89.             ->getResult();
  90.     }
  91.     public function findActiveOfferCategoriesByCityIdAndPattern(int $cityIdstring $pattern): array
  92.     {
  93.         $queryBuilder $this->createQueryBuilder('category');
  94.         $expr $queryBuilder->expr();
  95.         return $queryBuilder
  96.             ->andWhere($expr->eq('category.city'':cityId'))
  97.             ->andWhere($expr->eq('category.active'':active'))
  98.             ->andWhere($expr->eq('category.past'':past'))
  99.             ->andWhere($expr->eq('category.domainObjectID'':domainObjectId'))
  100.             ->andWhere(
  101.                 $expr->like(
  102.                     $expr->lower('category.name'),
  103.                     ':pattern',
  104.                 ),
  105.             )
  106.             ->andWhere($expr->in('category.typeID'':types'))
  107.             ->setParameters([
  108.                 'cityId' => $cityId,
  109.                 'pattern' => \sprintf('%%%s%%', \mb_strtolower($pattern)),
  110.                 'active' => true,
  111.                 'past' => false,
  112.                 'types' => [Category::DEFAULT_CATEGORY_TYPECategory::SERVICE_CATEGORY_TYPE],
  113.                 'domainObjectId' => Category::OFFER_CATEGORY_ID,
  114.             ])
  115.             ->addOrderBy('category.ID')
  116.             ->getQuery()
  117.             ->getResult();
  118.     }
  119.     public function findActiveMeOnMapCategoriesByCityId(int $cityId): array
  120.     {
  121.         $queryBuilder $this->createQueryBuilder('category');
  122.         $expr $queryBuilder->expr();
  123.         return $queryBuilder
  124.             ->andWhere($expr->eq('category.city'':cityId'))
  125.             ->andWhere($expr->eq('category.meOnMapActive'':active'))
  126.             ->andWhere($expr->eq('category.past'':past'))
  127.             ->andWhere($expr->eq('category.active'':active'))
  128.             ->setParameters([
  129.                 'cityId' => $cityId,
  130.                 'active' => true,
  131.                 'past' => false,
  132.             ])
  133.             ->addOrderBy('category.meOnMapPosition')
  134.             ->addOrderBy('category.ID')
  135.             ->getQuery()
  136.             ->getResult();
  137.     }
  138.     public function findActiveMeOnMapFeaturedCategoriesByCityId(int $cityId): array
  139.     {
  140.         $queryBuilder $this->createQueryBuilder('category');
  141.         $expr $queryBuilder->expr();
  142.         return $queryBuilder
  143.             ->andWhere($expr->eq('category.city'':cityId'))
  144.             ->andWhere($expr->eq('category.meOnMapFeaturedActive'':meOnMapFeaturedActive'))
  145.             ->andWhere($expr->eq('category.past'':past'))
  146.             ->andWhere($expr->eq('category.active'':categoryActive'))
  147.             ->setParameters([
  148.                 'cityId' => $cityId,
  149.                 'meOnMapFeaturedActive' => true,
  150.                 'categoryActive' => true,
  151.                 'past' => false,
  152.             ])
  153.             ->addOrderBy('category.meOnMapFeaturedPosition')
  154.             ->addOrderBy('category.ID')
  155.             ->getQuery()
  156.             ->getResult();
  157.     }
  158. }