src/Repository/ShoppingMallRepository.php line 95

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\PackageOrderItem;
  4. use App\Entity\PackageRecipe;
  5. use App\Entity\Shop;
  6. use App\Entity\ShopHasCategories;
  7. use App\Entity\Shoppingmall;
  8. use App\Entity\ShoppingmallCounts;
  9. use App\Entity\User;
  10. use App\Helpers\OutletTypesHelper;
  11. use App\Services\Package\PackageQueryBuilder;
  12. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  13. use Doctrine\Persistence\ManagerRegistry;
  14. use Symfony\Component\HttpFoundation\Session\Session;
  15. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface as TokenStorage;
  16. use function array_key_first;
  17. use function sprintf;
  18. use function Symfony\Component\String\u;
  19. class ShoppingMallRepository extends ServiceEntityRepository
  20. {
  21.     use BaseRepository;
  22.     /**
  23.      * @var User
  24.      */
  25.     protected $_user;
  26.     /**
  27.      * @var TokenStorage
  28.      */
  29.     protected $_tokenStorage;
  30.     /**
  31.      * @var PackageQueryBuilder
  32.      */
  33.     protected $_packageQueryBuilder;
  34.     public function __construct(ManagerRegistry $registry$entityClassTokenStorage $tokenStoragePackageQueryBuilder $packageQueryBuilder)
  35.     {
  36.         $this->_tokenStorage $tokenStorage;
  37.         $this->_packageQueryBuilder $packageQueryBuilder;
  38.         parent::__construct($registry$entityClass);
  39.     }
  40.     /**
  41.      * @param $id
  42.      * @return \App\Entity\Shoppingmall[]|\Doctrine\Common\Collections\Collection
  43.      */
  44.     public function getByCity($id)
  45.     {
  46.         $query $this->_em->createQuery(
  47.             'SELECT DISTINCT s.shoppingMall
  48.                 FROM App\Entity\Shop s 
  49.              WHERE s.city = :city_id'
  50.         );
  51.         $query->setParameter('city_id'$id);
  52.         return $query->getResult();
  53.     }
  54.     public function totalShoppingMalls($historyFilter)
  55.     {
  56.         $qb $this->createQueryBuilder('shopping_mall');
  57.         $qb->select("count(distinct(shopping_mall.id))");
  58. //        if (isset($historyFilter['type'])) {
  59. //            if ($historyFilter['type'] == HistoryStoresType::HISTORY_CLOSED) {
  60. //                // Vybere id storu, ktere byly vybrane v dany cas
  61. //                $historyFilter['dateFrom'] = null;
  62. //                $historyFilter['dateTo'] = null;
  63. //                $shopIds = $this->getIdsByHistoryFilter($historyFilter);
  64. //
  65. //                $qb->andWhere('shop._id IN (:shopIds)');
  66. //                $qb->setParameter(':shopIds', $shopIds);
  67. //
  68. //            } elseif ($historyFilter['type'] == HistoryStoresType::HISTORY_NEW) {
  69. //                $qb->andWhere('shop.isNew = true');
  70. //            }
  71. //        }
  72.         return (int)$qb->getQuery()->getSingleScalarResult();
  73.     }
  74.     /**
  75.      * @param array $params
  76.      * @param \Symfony\Component\HttpFoundation\Session\Session $session
  77.      * @return array
  78.      */
  79.     public function findByFilter(array $params = [], Session $session) {
  80.         $session->remove('activeCity');
  81.         $session->remove('activeCountry');
  82.         $session->remove('activeActive');
  83.         $start $params['start'] ?? null;
  84.         $length $params['length'] ?? null;
  85.         $orders $params['orders'] ?? [];
  86.         $columns $params['columns'] ?? [];
  87.         $otherConditions $params['otherConditions'] ?? '';
  88.         $withPaginator $params['paginator'] ?? false;
  89.         $historyFilter $params['historyFilter'] ?? [];
  90.         // Create Main Query
  91.         //$query = $this->createQueryBuilder('shop');
  92.         $query $this->createQueryBuilder('shopping_mall')
  93.             // However, add a "always true" condition to keep an uniform treatment in all cases
  94.             // Add condition
  95.             ->andwhere($otherConditions != '' ?  $otherConditions "1=1");
  96.         // Create inner joins
  97.         $query->leftJoin('shopping_mall.city''city');
  98.         $query->leftJoin('shopping_mall.operator''operator');
  99.         foreach ($columns as $key => $column) {
  100.             $values = [];
  101.             $prohibitedCols = ['updatedAt''createdAt'];
  102.             if ($column['search']['value'] != '' && $column['search']['value'] != '[]' && in_array($column['name'], $prohibitedCols) == false) {
  103.                 $searchItem $column['search']['value'];
  104.                 if($column['name'] == 'kinds'){
  105.                     continue;
  106.                 }
  107.                 $subquery null;
  108.                 $searchQueryLikeOrEq '';
  109.                 $searchValue null;
  110.                 $searchQueryPatterns  = [
  111.                     'label' => 'shopping_mall.label',
  112.                     'brands' => 'shopping_mall.id IN ('$subquery .')',
  113.                     'stores' => 'shopping_mall.id IN ('$subquery .')',
  114.                     'kinds' => 'shopkinds.label',
  115.                     'city' => 'city.label',
  116.                     'country' => 'city.country',
  117.                     'zip' => 'shopping_mall.zip',
  118.                     'street' => 'shopping_mall.street',
  119.                     'shoppingmall' => 'shopping_mall.label',
  120.                     'extent_label' => 'shop.extentLabel',
  121.                     'shoppingarea' => 'shoppingarea.label',
  122.                     'categories' => 'category.label',
  123.                     'isActive' => 'shopping_mall.isActive',
  124.                     'isOutlet' => 'shopping_mall.isOutlet',
  125.                     'operator' => 'operator.name',
  126.                     'category_primary' => '(shophascategory.isPrimary = true AND category.label LIKE \'%'.$searchItem.'%\')',
  127.                 ];
  128.                 if(substr($searchItem,0,2) == '["' && $column['name'] == 'brands') {
  129.                     // json values
  130.                     $values json_decode($column['search']['value'], true);
  131.                     $subquery $this->_em->getRepository(Shop::class)->createQueryBuilder('s1');
  132.                     $subquery
  133.                         ->select('shoppingMall_s1.id')
  134.                         ->leftJoin('s1.brands''brands_s1')
  135.                         ->leftJoin('s1.shoppingMall''shoppingMall_s1')
  136.                         ->where('brands_s1.label IN (:values'.$key.') ');
  137.                     $subquery->setParameter('values'.$key$values);
  138.                 } else if(substr($searchItem,0,2) == '["') {
  139.                     $values json_decode($column['search']['value'], true);
  140.                     //$searchQueryLikeOrEq = ' IN (:values' . $key . ') ';
  141.                 } else if($column['name'] == 'stores'){
  142.                     $subquery $this->_em->getRepository(Shop::class)->createQueryBuilder('s2');
  143.                     $subquery
  144.                         ->select('shoppingMall_s2.id')
  145.                         ->leftJoin('s2.shoppingMall''shoppingMall_s2');
  146.                     if(strpos($column['search']['value'], 'eq:') !== false) {
  147.                         $paramKey uniqid('stores_');
  148.                         $subquery->where(
  149.                             $subquery
  150.                                 ->expr()
  151.                                 ->like('s2.name',
  152.                                     ':' $paramKey
  153.                                 )
  154.                         );
  155.                         $subquery->setParameter($paramKey'%' str_replace('eq:'''$searchItem) . '%');
  156.                     } else {
  157.                         $paramKey uniqid('stores_');
  158.                         $subquery->where(
  159.                             $subquery
  160.                                 ->expr()
  161.                                 ->like('s2.name'':' $paramKey)
  162.                         );
  163.                         $subquery->setParameter($paramKey$searchItem);
  164.                     }
  165.                 } else if(strpos($column['search']['value'], 'eql:') !== false){
  166.                     $searchValue str_replace('eql:'''$searchItem)."%";
  167.                     $paramKey uniqid('eql_');
  168.                     $col1 $searchQueryPatterns[$column['name']] ?? 'shopping_mall.' $column['name'];
  169.                     $query->andWhere(
  170.                         $query->expr()->like($col1':' $paramKey)
  171.                     );
  172.                     $query->setParameter($paramKey$searchValue.'%');
  173.                 } else if(strpos($column['search']['value'], 'eq:') !== false){
  174.                     $searchValue str_replace('eq:'''$searchItem);
  175.                     $paramKey uniqid('eq_');
  176.                     $col1 $searchQueryPatterns[$column['name']] ?? 'shopping_mall.' $column['name'];
  177.                     $query->andWhere(
  178.                         $query->expr()->eq($col1':' $paramKey)
  179.                     );
  180.                     $query->setParameter($paramKey$searchValue);
  181.                 } else {
  182.                     $paramKey uniqid('standard_');
  183.                     $col1 $searchQueryPatterns[$column['name']] ?? 'shopping_mall.' $column['name'];
  184.                     $query->andWhere(
  185.                         $query->expr()->like($col1':' $paramKey)
  186.                     );
  187.                     $query->setParameter($paramKey'%'.$searchItem.'%');
  188.                 }
  189.                 if($column['name'] == 'city'){
  190.                     $session->set('activeCity'$searchItem);
  191.                 }
  192.                 if($column['name'] == 'operator'){
  193.                     $session->set('operator'$searchItem);
  194.                 }
  195.                 if($column['name'] == 'country'){
  196.                     $session->set('activeCountry'$searchItem);
  197.                 }
  198.                 if($column['name'] == 'isActive'){
  199.                     $session->set('activeActive'$searchItem);
  200.                 }
  201.                 if(isset($values) && !empty($values)) {
  202.                     if($column['name'] == "isOutlet") {
  203.                         $final = [];
  204.                         foreach($values as $value) {
  205.                             $final[] = OutletTypesHelper::getOutletIdByType($value);
  206.                         }
  207.                         $values $final;
  208.                     }
  209.                     $paramKey uniqid('values_');
  210.                     $col1 $searchQueryPatterns[$column['name']] ?? 'shopping_mall.' $column['name'];
  211.                     $query->andWhere(
  212.                         $query->expr()->in($col1':'.$paramKey)
  213.                     );
  214.                     $query->setParameter($paramKey$values);
  215. //                    $query->andWhere(
  216. //                        $searchQueryPatterns[$column['name']] ?? 'shopping_mall.' . $column['name']
  217. //                    )->setParameter('values' . $key, $values);
  218.                 }
  219.             }
  220.             if($column['name'] == 'updatedAt'){
  221.                 $updatedAtDate $column['search']['value'];
  222.             }
  223.             if($column['name'] == 'createdAt'){
  224.                 $createdAtDate $column['search']['value'];
  225.             }
  226.         }
  227.         if (!is_null($updatedAtDate) && $updatedAtDate != '' && $updatedAtDate != '-') {
  228.             $explDate explode('-'$updatedAtDate);
  229.             if(isset($explDate[0]) && $explDate[0] != ''){
  230.                 $dateFrom \DateTime::createFromFormat('Y/m/d'$explDate[0]);
  231.                 $query->andWhere('shopping_mall.lastSyncTime >= (:updatedAtFrom)');
  232.                 $query->setParameter(':updatedAtFrom'$dateFrom);
  233.             }
  234.             if(isset($explDate[1]) && $explDate[1] != ''){
  235.                 $dateTo \DateTime::createFromFormat('Y/m/d'$explDate[1]);
  236.                 $query->andWhere('shopping_mall.lastSyncTime <= (:updatedAtTo)');
  237.                 $query->setParameter(':updatedAtTo'$dateTo);
  238.             }
  239.         }
  240.         if (!is_null($createdAtDate) && $createdAtDate != '' && $createdAtDate != '-') {
  241.             $explDate explode('-'$createdAtDate);
  242.             if(isset($explDate[0]) && $explDate[0] != ''){
  243.                 $dateFrom \DateTime::createFromFormat('Y/m/d'$explDate[0]);
  244.                 $query->andWhere('shopping_mall.createdAt >= (:createdAtFrom)');
  245.                 $query->setParameter(':createdAtFrom'$dateFrom);
  246.             }
  247.             if(isset($explDate[1]) && $explDate[1] != ''){
  248.                 $dateTo \DateTime::createFromFormat('Y/m/d'$explDate[1]);
  249.                 $query->andWhere('shopping_mall.createdAt <= (:createdAtTo)');
  250.                 $query->setParameter(':createdAtTo'$dateTo);
  251.             }
  252.         }
  253.         $countResult $query->select('count(distinct(shopping_mall.id))')->getQuery()->getSingleScalarResult();
  254.         // Limit
  255.         if($length != "NaN")
  256.             $query->select('shopping_mall')->setFirstResult($start)->setMaxResults($length);
  257. //        $qbShops = $this->_em->getRepository(Shop::class)->createQueryBuilder('shop');
  258. //        // pocty brandu
  259. //        $qbShops->select('count(distinct(brands.id))')
  260. //            ->join('shop.shoppingMall', 'shoppingmall')
  261. //            ->leftJoin('shop.brands', 'brands')
  262. //            ->where('shoppingmall.id = shopping_mall.id')
  263. //            ->andWhere('shop.isActive = true')
  264. //            ->groupBy('shopping_mall.id');
  265. //
  266. //        // pocty stores
  267. //        $qbShops2 = $this->_em->getRepository(Shop::class)->createQueryBuilder('shop2');
  268. //        $qbShops2->select('count(distinct(shop2.id))')
  269. //            ->join('shop2.shoppingMall', 'shoppingmall2')
  270. //            ->where('shoppingmall2.id = shopping_mall.id')
  271. //            ->andWhere('shop2.isActive = true')
  272. //            ->groupBy('shopping_mall.id');
  273.         // pocty brandu a obchodu
  274.         $query->leftJoin(ShoppingmallCounts::class, 'smc''WITH''smc.shoppingmallId = shopping_mall.id');
  275.         $query->select('shopping_mall')
  276.             ->addSelect('smc.brandCount AS brandsCount')
  277.             ->addSelect('smc.shopCount AS storesCount')
  278.             ->addSelect('CAST(REPLACE(shopping_mall.specialOffer, \' \', \'\')) AS specialOfferSorting')
  279.             ->addSelect('CAST(REPLACE(shopping_mall.zip, \' \', \'\')) AS zipSorting')
  280.             ->addSelect('(CASE WHEN shopping_mall.specialOffer = \'\' THEN 1 ELSE 0 END) AS HIDDEN specialOfferSortingPre')
  281.         ;
  282.         // Ordering
  283.         $ordersPatterns = [
  284.             'type' => 'shoptype.label',
  285.             'brands' => 'brandsCount',
  286.             'stores' => 'storesCount',
  287.             'kinds' => 'shopkinds.label',
  288.             'city' => 'city.label',
  289.             'country' => 'city.country',
  290.             'zip' => 'zipSorting',
  291.             'shoppingmall' => 'shopping_mall.label',
  292.             'shoppingarea' => 'shoppingarea.label',
  293.             'categories' => 'category.label',
  294.             'category_primary' => 'category.label',
  295.             'extent_label' => 'shop.extentLabel',
  296.             'specialOffer' => 'specialOfferSorting'
  297.         ];
  298.         foreach ($orders as $key => $order) {
  299.             // $order['name'] is the name of the order column as sent by the JS
  300.             if($order['name'] != '') {
  301.                 if($order['name'] == 'specialOffer'){
  302.                     $query->orderBy('specialOfferSortingPre''ASC');
  303.                     $query->addOrderBy($ordersPatterns[$order['name']] ?? 'shopping_mall.' $order['name'], $order['dir']);
  304.                 }else {
  305.                     $query->orderBy($ordersPatterns[$order['name']] ?? 'shopping_mall.' $order['name'], $order['dir']);
  306.                 }
  307.             }
  308.         }
  309.         if(!isset($orders[0]['name'])){
  310.             $query->orderBy('shopping_mall.label''ASC');
  311.         }
  312.         $query->groupBy('shopping_mall.id');
  313. //        echo $query->getQuery()->getSQL();
  314. //        exit;
  315.         // Execute
  316.         //echo $query->getQuery()->getSQL();
  317.         $results $query->getQuery()->getResult();
  318.         //if($withPaginator == false) {
  319.         //$countResult = count($countQuery->getQuery()->getResult());
  320. //        }else{
  321. //            $countResult = count($results);
  322. //        }
  323. //        if(isset($orders[0]['name']) && isset($orders[0]['name']) == 'specialOffer'){
  324. //            usort($results, function ($a, $b) {
  325. //                $numA = (int) str_replace(' ', '', $a[0]->getSpecialOffer());
  326. //                $numB = (int) str_replace(' ', '', $b[0]->getSpecialOffer());
  327. //                return $numA <=> $numB;
  328. //            });
  329. //        }
  330.         return array(
  331.             "results" => $results,
  332.             "countResult" => $countResult,
  333.         );
  334.     }
  335.     /**
  336.      * @param $selections
  337.      * @return array
  338.      * @throws \Doctrine\ORM\NonUniqueResultException
  339.      */
  340.     public function compareSelections(array $selectionsSession $session$sortByCount true$categoryFilter null){
  341.         $result = [];
  342.         $resultCount = [];
  343.         $resultBrands = [];
  344.         $resultBrandsCount = [];
  345.         $repoShops $this->_em->getRepository(Shop::class);
  346.         $repoCategory $this->_em->getRepository(ShopHasCategories::class);
  347.         $firstSelectionCode array_key_first($selections);
  348.         foreach($selections as $index => $selectionFilter){
  349.             // nactu mally dle vstupniho filtru, nasledne z nich vyberu obchody a vlozim pro rozdeleni
  350.             $resultSelectionFilter = ($this->findByFilter($selectionFilter$session))['results'];
  351.             $mallsIds = [];
  352.             /** @var Shoppingmall $mall */
  353.             foreach($resultSelectionFilter as $mall) {
  354.                 $mallsIds[] = $mall[0]->getId();
  355.             }
  356.             $shops $repoShops->findBy(['shoppingMall' => $mallsIds'isActive' => true]);
  357.             $shopHasCategories $repoCategory->findBy(['shop' => $shops]);
  358.             $categories = [];
  359.             foreach ($shopHasCategories as $shopHasCategory) {
  360.                 if($shopHasCategory->getCategory() != null) {
  361.                     $categories[$shopHasCategory->getCategory()->getId()] = $shopHasCategory->getCategory()->getLabel();
  362.                 }
  363.             }
  364.             asort($categories);
  365.             foreach ($shops as $item) {
  366.                 // Category Filter
  367.                 if(isset($categoryFilter) && $categoryFilter != '') {
  368.                     $filteredCollectionCategories $item->getShopHasCategories()->filter(function (ShopHasCategories $shopHasCategory) use ($categoryFilter) {
  369.                         return $shopHasCategory->getCategory() != null && $shopHasCategory->getCategory()->getId() == $categoryFilter;
  370.                     });
  371.                     // pokud po filtraci nic nezbyde - shop neobsahuje kategorii - preskocim obchod
  372.                     if (count($filteredCollectionCategories) == 0) {
  373.                         continue;
  374.                     }
  375.                 }
  376.                 // reseni shop in shop, vsechny obchody jsou v nazvu oddeleny pomlckou
  377.                 $nameExp explode(' - '$item->getName());
  378.                 $nameTrim trim($nameExp[0]);
  379.                 if(!isset($resultCount[$nameTrim][$index]['count'])){
  380.                     $resultCount[$nameTrim][$index]['count'] = 0;
  381.                 }
  382.                 $result[$nameTrim][$index] = $item;
  383.                 $resultCount[$nameTrim][$index]['count']++;
  384.                 // pocitani brandů
  385.                 foreach ($item->getBrands() as $brand) {
  386.                     $brandLabel $brand->getLabel();
  387.                     if(!isset($resultBrandsCount[$brandLabel][$index])){
  388.                         $resultBrandsCount[$brandLabel][$index]['count'] = 0;
  389.                     }
  390.                     $resultBrands[$brandLabel][$index] = $brand;
  391.                     $resultBrandsCount[$brandLabel][$index]['count']++;
  392.                 }
  393.             }
  394.         }
  395.         if($sortByCount) {
  396.             uasort($result, array(ShopRepository::class, "sortArrayByCountName"));
  397.             uasort($resultBrands, array(ShopRepository::class, "sortArrayByCountLabel"));
  398.         }else{
  399.             uasort($result, array(ShopRepository::class, "sortArrayByName"));
  400.             uasort($resultBrands, array(ShopRepository::class, "sortArrayByLabel"));
  401.         }
  402.         return [
  403.             'results' => $result,
  404.             'resultsCount' => $resultCount,
  405.             'resultsBrands' => $resultBrands,
  406.             'resultsBrandsCount' => $resultBrandsCount,
  407.             'firstSelectionCode' => $firstSelectionCode,
  408.             'categories' => $categories
  409.         ];
  410.     }
  411.     public function createQueryBuilder($alias$indexBy null)
  412.     {
  413.         $this->_packageQueryBuilder->resetTableAliases();
  414.         $qb parent::createQueryBuilder($alias$indexBy);
  415.         $this->_user $this->_tokenStorage->getToken()->getUser();
  416.         if($this->_user instanceof User) {
  417.             $roles $this->_user->getRoles();
  418.             if(in_array('ROLE_ADMIN'$roles)){
  419.                 return $qb;
  420.             }
  421.             $orXStat $qb->expr()->orX();
  422.             $activePackages $this->_user->getActivePackages();
  423.             $addOr false;
  424.             if(count($activePackages) == 0) {
  425.                 $packageRecipeRepo $this->_em->getRepository(PackageRecipe::class);
  426.                 $freePackage $packageRecipeRepo->findOneBy(['defaultUserPackage' => true'active' => true])
  427.                     ?: $packageRecipeRepo->findOneBy(['class_name' => 'FreePackage']);
  428.                 if ($freePackage) {
  429.                     $exprFunc $this->_packageQueryBuilder->createByPackage($freePackage$qb$aliasPackageQueryBuilder::BASE_ENTITY_MALL);
  430.                     if ($exprFunc != false) {
  431.                         $orXStat->add($exprFunc);
  432.                         $addOr true;
  433.                     }
  434.                 }
  435.             }
  436.             /** @var PackageOrderItem $activePackage */
  437.             foreach ($activePackages as $activePackage) {
  438.                 // prida do query builderu potrebne podminky dle zaplacenych balicku
  439.                 $expr $this->_packageQueryBuilder->createByPackage($activePackage->getPackageRecipe(), $qb$aliasPackageQueryBuilder::BASE_ENTITY_MALL);
  440.                 if($expr != false) {
  441.                     $addOr true;
  442.                     $orXStat->add($expr);
  443.                 }
  444.             }
  445.             if($addOr) {
  446.                 $qb->where($orXStat);
  447.             }
  448.         }
  449.         return $qb;
  450.     }
  451.     /**
  452.      * GAP analysis over an explicit list of mall IDs. One selection per mall.
  453.      * Builds the same shop/brand × selection matrix as compareSelections(), but
  454.      * skips the session/filter layer.
  455.      */
  456.     public function compareByMallIds(array $mallIdsbool $sortByCount true$categoryFilter null): array
  457.     {
  458.         $mallIds array_values(array_unique(array_filter(array_map('intval'$mallIds))));
  459.         $result = [];
  460.         $resultCount = [];
  461.         $resultBrands = [];
  462.         $resultBrandsCount = [];
  463.         $categories = [];
  464.         $repoShops $this->_em->getRepository(Shop::class);
  465.         $repoCategory $this->_em->getRepository(ShopHasCategories::class);
  466.         foreach ($mallIds as $mallId) {
  467.             $index = (string) $mallId;
  468.             $shops $repoShops->findBy(['shoppingMall' => $mallId'isActive' => true]);
  469.             $shopHasCategories $repoCategory->findBy(['shop' => $shops]);
  470.             foreach ($shopHasCategories as $shopHasCategory) {
  471.                 if ($shopHasCategory->getCategory() !== null) {
  472.                     $categories[$shopHasCategory->getCategory()->getId()] = $shopHasCategory->getCategory()->getLabel();
  473.                 }
  474.             }
  475.             foreach ($shops as $item) {
  476.                 if (isset($categoryFilter) && $categoryFilter !== '') {
  477.                     $matches $item->getShopHasCategories()->filter(function (ShopHasCategories $shc) use ($categoryFilter) {
  478.                         return $shc->getCategory() !== null && $shc->getCategory()->getId() == $categoryFilter;
  479.                     });
  480.                     if (count($matches) === 0) {
  481.                         continue;
  482.                     }
  483.                 }
  484.                 $nameExp explode(' - '$item->getName());
  485.                 $nameTrim trim($nameExp[0]);
  486.                 if (!isset($resultCount[$nameTrim][$index]['count'])) {
  487.                     $resultCount[$nameTrim][$index]['count'] = 0;
  488.                 }
  489.                 $result[$nameTrim][$index] = $item;
  490.                 $resultCount[$nameTrim][$index]['count']++;
  491.                 foreach ($item->getBrands() as $brand) {
  492.                     $brandLabel $brand->getLabel();
  493.                     if (!isset($resultBrandsCount[$brandLabel][$index])) {
  494.                         $resultBrandsCount[$brandLabel][$index]['count'] = 0;
  495.                     }
  496.                     $resultBrands[$brandLabel][$index] = $brand;
  497.                     $resultBrandsCount[$brandLabel][$index]['count']++;
  498.                 }
  499.             }
  500.         }
  501.         asort($categories);
  502.         if ($sortByCount) {
  503.             uasort($result, [\App\Repository\ShopRepository::class, 'sortArrayByCountName']);
  504.             uasort($resultBrands, [\App\Repository\ShopRepository::class, 'sortArrayByCountLabel']);
  505.         } else {
  506.             uasort($result, [\App\Repository\ShopRepository::class, 'sortArrayByName']);
  507.             uasort($resultBrands, [\App\Repository\ShopRepository::class, 'sortArrayByLabel']);
  508.         }
  509.         return [
  510.             'results' => $result,
  511.             'resultsCount' => $resultCount,
  512.             'resultsBrands' => $resultBrands,
  513.             'resultsBrandsCount' => $resultBrandsCount,
  514.             'firstSelectionCode' => isset($mallIds[0]) ? (string) $mallIds[0] : null,
  515.             'categories' => $categories,
  516.         ];
  517.     }
  518. }