src/Repository/ProductsRepository.php line 251

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\Products;
  4. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Doctrine\ORM\Query\ResultSetMapping;
  7. use Doctrine\Persistence\ManagerRegistry;
  8. /**
  9.  * @method Products|null find($id, $lockMode = null, $lockVersion = null)
  10.  * @method Products|null findOneBy(array $criteria, array $orderBy = null)
  11.  * @method Products[]    findAll()
  12.  * @method Products[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  13.  */
  14. class ProductsRepository extends ServiceEntityRepository
  15. {
  16.     private $em;
  17.     public function __construct(ManagerRegistry $registryEntityManagerInterface $em)
  18.     {
  19.         parent::__construct($registryProducts::class);
  20.         $this->em $em;
  21.     }
  22.     /**
  23.     * @return Products[] Returns an array of Products objects
  24.     */
  25.     public function findBySearch($keyword)
  26.     {
  27.         return $this->createQueryBuilder('p')
  28.             ->andWhere('p.name LIKE :keyword')
  29.             ->setParameter('keyword''%'$keyword .'%')
  30.             ->orderBy('p.name''ASC')
  31.             ->getQuery()
  32.             ->getResult()
  33.         ;
  34.     }
  35.     /**
  36.      * @return Products[] Returns an array of Products objects
  37.      */
  38.     public function findBySearchAvailable($keyword)
  39.     {
  40.         return $this->createQueryBuilder('p')
  41.             ->select('p','dp','d','c','pm','pi')
  42.             ->join('p.distributorProducts''dp')
  43.             ->join('dp.distributor''d')
  44.             ->join('p.productsSpecies''ps')
  45.             ->leftJoin('p.category''c')
  46.             ->leftJoin('p.productManufacturers''pm')
  47.             ->leftJoin('p.productFavourites''pf')
  48.             ->leftJoin('p.productImages''pi')
  49.             ->andWhere("MATCH_AGAINST(p.name,p.activeIngredient,p.description,p.slug) AGAINST(:search_term boolean) > 0")
  50.             ->setParameter('search_term''*'.$keyword.'*')
  51.             ->andWhere('p.isPublished = 1')
  52.             ->andWhere('p.isActive = 1')
  53.             ->andWhere("dp.itemId != ''")
  54.             ->getQuery()
  55.             ->getResult();
  56.             ;
  57.     }
  58.     /**
  59.      * @return Products[] Returns an array of Products objects
  60.      */
  61.     public function findBySearchAdmin($keyword$manufacturer)
  62.     {
  63.         $queryBuilder $this->createQueryBuilder('p')
  64.             ->select('p''pm')
  65.             ->join('p.productManufacturers''pm')
  66.             ->andWhere('p.isActive = :isActive')
  67.             ->setParameter('isActive'1);
  68.         if(!empty($keyword))
  69.         {
  70.             $queryBuilder
  71.                 ->andWhere('p.name LIKE :keyword')
  72.                 ->setParameter('keyword''%'$keyword .'%');
  73.         }
  74.         if(!empty($manufacturer))
  75.         {
  76.             $queryBuilder
  77.                 ->andWhere('pm.manufacturers = :manufacturer')
  78.                 ->setParameter('manufacturer'$manufacturer);
  79.         }
  80.         $queryBuilder
  81.             ->orderBy('p.name''ASC');
  82.         return [$queryBuilder->getQuery(), $queryBuilder->getQuery()->getResult()];
  83.     }
  84.     /**
  85.      * @throws \Doctrine\DBAL\Exception
  86.      */
  87.     public function findByKeyString($keywords$countryId)
  88.     {
  89.         $conn $this->getEntityManager()->getConnection();
  90.         $sql "SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));";
  91.         $stmt $conn->prepare($sql);
  92.         $stmt->executeStatement();
  93.         $queryBuilder $this->createQueryBuilder('p')
  94.             ->select('p','dp','d','c','pm','pi','pn','cu')
  95.             ->join('p.distributorProducts''dp')
  96.             ->join('dp.distributor''d')
  97.             ->join('p.productsSpecies''ps')
  98.             ->leftJoin('p.category''c')
  99.             ->leftJoin('p.productManufacturers''pm')
  100.             ->leftJoin('p.productFavourites''pf')
  101.             ->leftJoin('p.productImages''pi')
  102.             ->leftJoin('p.productNotes''pn')
  103.             ->leftJoin('pn.clinicUser''cu')
  104.             ->andWhere("MATCH_AGAINST(p.name,p.activeIngredient,p.description,p.slug) AGAINST(:search_term boolean) > 0")
  105.             ->setParameter('search_term''*'.$keywords.'*')
  106.             ->andWhere('d.addressCountry = :countryId')
  107.             ->setParameter('countryId'$countryId)
  108.             ->andWhere('p.isPublished = 1')
  109.             ->andWhere('p.isActive = 1');
  110.         return [$queryBuilder->getQuery(), $queryBuilder->getQuery()->getResult()];
  111.     }
  112.     public function findById($id)
  113.     {
  114.         $conn $this->getEntityManager()->getConnection();
  115.         $sql "SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));";
  116.         $stmt $conn->prepare($sql);
  117.         $stmt->executeStatement();
  118.         $queryBuilder $this->createQueryBuilder('p')
  119.             ->select('p','c','pm','pi')
  120.             ->join('p.productsSpecies''ps')
  121.             ->leftJoin('p.category''c')
  122.             ->leftJoin('p.productManufacturers''pm')
  123.             ->leftJoin('p.productFavourites''pf')
  124.             ->leftJoin('p.productImages''pi')
  125.             ->andWhere('p.id = :productId')
  126.             ->setParameter('productId'$id);
  127.         return $queryBuilder->getQuery()->getResult();
  128.     }
  129.     public function findByFilter($arraySearch$level)
  130.     {
  131.         $queryBuilder $this->createQueryBuilder('p')
  132.             ->select('p','dp','d','pm','pi')
  133.             ->Join('p.distributorProducts''dp')
  134.             ->join('dp.distributor''d')
  135.             ->join('p.productManufacturers''pm')
  136.             ->leftJoin('p.productFavourites''pf')
  137.             ->leftJoin('p.productImages''pi')
  138.             ->andWhere("MATCH_AGAINST(p.name,p.activeIngredient,p.description,p.slug) AGAINST(:search_term boolean) > 0")
  139.             ->setParameter('search_term''*'.$arraySearch[0]['categoryKeyword'].'*');
  140.         // Categories
  141.         if(array_key_exists('category'$arraySearch[0])) {
  142.             if (array_key_exists('categoryId'$arraySearch[0]['category'][0])) {
  143.                 if ($level == 1) {
  144.                     $queryBuilder
  145.                         ->andWhere("p.category = :categoryId")
  146.                         ->setParameter('categoryId'$arraySearch[0]['category'][0]['categoryId']);
  147.                 }
  148.                 if ($level == 2) {
  149.                     $queryBuilder
  150.                         ->andWhere("p.category2 = :categoryId")
  151.                         ->setParameter('categoryId'$arraySearch[0]['category'][0]['categoryId']);
  152.                 }
  153.                 if ($level == 3) {
  154.                     $queryBuilder
  155.                         ->andWhere("p.category3 = :categoryId")
  156.                         ->setParameter('categoryId'$arraySearch[0]['category'][0]['categoryId']);
  157.                 }
  158.             }
  159.         }
  160.         // Manufacturers
  161.         if(array_key_exists('selectedManufacturers'$arraySearch[0])){
  162.             $queryBuilder
  163.                 ->andWhere('pm.manufacturers in (:manufacturerIds)')
  164.                 ->setParameter('manufacturerIds'$arraySearch[0]['selectedManufacturers']);
  165.         }
  166.         // Distributors
  167.         if(array_key_exists('selectedDistributors'$arraySearch[0])){
  168.             $queryBuilder
  169.                 ->andWhere('dp.distributor in (:distributorIds)')
  170.                 ->setParameter('distributorIds'$arraySearch[0]['selectedDistributors']);
  171.         }
  172.         // Favourites
  173.         if($arraySearch[0]['favourite'] == 'true'){
  174.             $queryBuilder
  175.                 ->andWhere('pf.clinic = :clinic')
  176.                 ->setParameter('clinic'$arraySearch[0]['clinicId']);
  177.         }
  178.         // In Stock
  179.         if($arraySearch[0]['inStock'] == 'true'){
  180.             $queryBuilder
  181.                 ->andWhere('dp.stockCount > 0');
  182.         }
  183.         $queryBuilder
  184.             ->andWhere('p.isPublished = 1');
  185.         return [$queryBuilder->getQuery(), $queryBuilder->getQuery()->getResult()];
  186.     }
  187.     public function findByListId($product_ids)
  188.     {
  189.         $queryBuilder $this->createQueryBuilder('p')
  190.             ->select('p','dp','d','c','pm','pi')
  191.             ->Join('p.distributorProducts''dp')
  192.             ->join('dp.distributor''d')
  193.             ->join('p.category''c')
  194.             ->join('p.productManufacturers''pm')
  195.             ->leftJoin('p.productFavourites''pf')
  196.             ->leftJoin('p.productImages''pi')
  197.             ->andWhere("dp.product IN (:product_ids)")
  198.             ->setParameter('product_ids'$product_ids)
  199.             ->andWhere('p.isPublished = 1');
  200.         return [$queryBuilder->getQuery(), $queryBuilder->getQuery()->getResult()];
  201.     }
  202.     public function adminFindAll()
  203.     {
  204.         $queryBuilder $this->createQueryBuilder('p')
  205.             ->select('p')
  206.             ->andWhere('p.isActive = 1')
  207.             ->orderBy('p.name''ASC');
  208.         return [$queryBuilder->getQuery(), $queryBuilder->getQuery()->getResult()];
  209.     }
  210.     public function findByRand()
  211.     {
  212.         $queryBuilder $this->createQueryBuilder('p')
  213.             ->select('p','dp','d','c','pm','pi''RAND() as HIDDEN rand')
  214.             ->join('p.distributorProducts''dp')
  215.             ->join('dp.distributor''d')
  216.             ->leftJoin('p.category''c')
  217.             ->leftJoin('p.productManufacturers''pm')
  218.             ->leftJoin('p.productFavourites''pf')
  219.             ->leftJoin('p.productImages''pi')
  220.             ->andWhere('pi.isDefault = 1')
  221.             ->andWhere('p.isActive = 1')
  222.             ->andWhere('p.isPublished = 1')
  223.             ->andWhere('dp.unitPrice > 0')
  224.             ->andWhere('p.priceFrom > 0')
  225.             //->groupBy('dp.id')
  226.             ->orderBy('rand')
  227.             ->setMaxResults(10);
  228.         return $queryBuilder->getQuery()->getResult();
  229.         $conn $this->em->getConnection();
  230.         $res $conn->prepare($sql)->executeQuery()->fetchAll();
  231.         return $res;
  232.     }
  233.     public function findByManufacturer($distributorId$manufacturerId$speciesId):array
  234.     {
  235.         $queryBuilder $this->createQueryBuilder('p')
  236.             ->select('p','dp','d','pm')
  237.             ->join('p.distributorProducts''dp')
  238.             ->join('dp.distributor''d')
  239.             ->leftJoin('p.productsSpecies''ps')
  240.             ->leftJoin('p.productManufacturers''pm')
  241.             ->andWhere('p.isActive = 1')
  242.             ->andWhere('p.isPublished = 1')
  243.             ->andWhere('dp.distributor = :distributorId')
  244.             ->setParameter('distributorId'$distributorId);
  245.         if($manufacturerId 0)
  246.         {
  247.             $ids = [$manufacturerId];
  248.             $queryBuilder
  249.                 ->andWhere('pm.manufacturers in (:manufacturerIds)')
  250.                 ->setParameter('manufacturerIds'$ids);
  251.         }
  252.         if($speciesId 0)
  253.         {
  254.             $ids = [$speciesId];
  255.             $queryBuilder
  256.                 ->andWhere('ps.species in (:speciesIds)')
  257.                 ->setParameter('speciesIds'$ids);
  258.         }
  259.         $queryBuilder
  260.             ->orderBy('p.name''DESC')
  261.         ;
  262.         return [$queryBuilder->getQuery(), $queryBuilder->getQuery()->getResult()];
  263.     }
  264.     public function findyDistributor($productId)
  265.     {
  266.         $conn $this->getEntityManager()->getConnection();
  267.         $sql "
  268.         SELECT 
  269.             p.name,
  270.             p.id as product_id,
  271.             p.size,
  272.             d.id as distributor_id,
  273.             d.distributor_name,
  274.             d.tracking_id,
  275.             d.shipping_policy,
  276.             d.sales_tax_policy,
  277.             d.logo,
  278.             dp.unit_price,
  279.             dp.stock_count,
  280.             dp.item_id,
  281.             dp.sku
  282.         FROM products p 
  283.             JOIN distributor_products dp ON p.id = dp.product_id 
  284.             JOIN distributors d ON dp.distributor_id = d.id 
  285.         WHERE dp.product_id = :productId";
  286.         $stmt $conn->prepare($sql)->executeQuery(['productId' => $productId])->fetchAllAssociative();
  287.         return $stmt;
  288.     }
  289.     /**
  290.      * @return Products[] Returns an array of Products objects
  291.      */
  292.     public function findByDateCreated()
  293.     {
  294.         return $this->createQueryBuilder('p')
  295.             ->andWhere('p.created LIKE :keyword')
  296.             ->setParameter('keyword''2022%')
  297.             ->orWhere('p.created LIKE :keyword')
  298.             ->setParameter('keyword''2023%')
  299.             ->orWhere('p.isActive = :active')
  300.             ->setParameter('active'0)
  301.             ->orderBy('p.name''ASC')
  302.             ->getQuery()
  303.             ->getResult()
  304.             ;
  305.     }
  306.     public function deleteOldProducts()
  307.     {
  308.         $conn $this->getEntityManager()->getConnection();
  309.         $sql "SET foreign_key_checks = 0;";
  310.         $stmt $conn->prepare($sql);
  311.         $stmt->executeStatement();
  312.         $sql "DELETE FROM products WHERE created LIKE '2022%';";
  313.         $stmt $conn->prepare($sql);
  314.         $stmt->executeStatement();
  315.         $sql "DELETE FROM products WHERE created LIKE '2023%';";
  316.         $stmt $conn->prepare($sql);
  317.         $stmt->executeStatement();
  318.     }
  319.     public function findByNotIn($ids)
  320.     {
  321.         $queryBuilder $this->createQueryBuilder('p')
  322.             ->select('p')
  323.             ->andWhere('p.id NOT IN (:ids)')
  324.             ->setParameter('ids'$ids);
  325.         return $queryBuilder->getQuery()->getResult();
  326.     }
  327. }