src/Repository/Franchise/FranchiseRepository.php line 24

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Repository\Franchise;
  4. use App\Entity\Franchise\Franchise;
  5. use App\Entity\Security\Manager;
  6. use App\Entity\Security\User;
  7. use App\Helper\Date\DateTimeHelper;
  8. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  9. use Doctrine\ORM\Query;
  10. use Doctrine\ORM\QueryBuilder;
  11. use Doctrine\Persistence\ManagerRegistry;
  12. /**
  13.  * @method null|Franchise find($id, $lockMode = null, $lockVersion = null)
  14.  * @method null|Franchise findOneBy(array $criteria, array $orderBy = null)
  15.  * @method Franchise[]    findAll()
  16.  * @method Franchise[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  17.  */
  18. class FranchiseRepository extends ServiceEntityRepository
  19. {
  20.     public function __construct(
  21.         ManagerRegistry $registry,
  22.         private DateTimeHelper $dateTimeHelper,
  23.     ) {
  24.         parent::__construct($registryFranchise::class);
  25.     }
  26.     /**
  27.      * Query for getting all mode with specific columns (Default Columns).
  28.      */
  29.     public function getDefaultQB(): QueryBuilder
  30.     {
  31.         return $this->createQueryBuilder('f')
  32.             ->select('f.id''f.name''f.status''f.createdAt')
  33.             ->orderBy('f.id''ASC')
  34.         ;
  35.     }
  36.     public function getMultipleFranchisesQB(): QueryBuilder
  37.     {
  38.         return $this->createQueryBuilder('f')
  39.             ->where('f.multiple = :multiple')
  40.             ->setParameter('multiple'true)
  41.         ;
  42.     }
  43.     public function getFranchisesQuery(array $criteria = []): Query
  44.     {
  45.         $qb $this->getDefaultQB()
  46.             ->addSelect('m.email AS managerEmail''COUNT(DISTINCT s.id) AS countShops''src.name AS source''MIN(d.url) AS domainUrl')
  47.             ->leftJoin('f.shops''s')
  48.             ->leftJoin('s.source''src')
  49.             ->leftJoin('f.managers''m')
  50.             ->leftJoin('f.domains''d')
  51.         ;
  52.         if (true === isset($criteria['search'])) {
  53.             $qb->andWhere('f.id LIKE :search OR f.name LIKE :search OR m.email LIKE :search OR m.firstName LIKE :search OR m.lastName LIKE :search')
  54.                 ->setParameter('search''%' $criteria['search'] . '%')
  55.             ;
  56.         }
  57.         if (true === isset($criteria['status'])) {
  58.             $qb->andWhere('f.status = :status')
  59.                 ->setParameter('status'$criteria['status'])
  60.             ;
  61.         }
  62.         if (true === isset($criteria['period'])) {
  63.             [$start$end] = $this->dateTimeHelper->periodToDates($criteria['period']);
  64.             $qb->andWhere('f.createdAt BETWEEN :startingDate AND :endingDate')
  65.                 ->setParameter('startingDate'$start)
  66.                 ->setParameter('endingDate'$end)
  67.             ;
  68.         }
  69.         if (true === isset($criteria['source'])) {
  70.             $qb->andWhere('s.source = :source')
  71.                 ->setParameter('source'$criteria['source'])
  72.             ;
  73.         }
  74.         return $qb->groupBy('f.id')->getQuery();
  75.     }
  76.     /**
  77.      * findByIdAndUser.
  78.      */
  79.     public function findByIdAndUser(int $idUser $user): ?Franchise
  80.     {
  81.         $qb $this->createQueryBuilder('f')
  82.             ->where('f.id = :id')
  83.             ->setParameter('id'$id)
  84.             ->setMaxResults(1)
  85.         ;
  86.         if ($user instanceof Manager) {
  87.             $qb->join('f.managers''m')
  88.                 ->andWhere('m.id = :manager')
  89.                 ->setParameter('manager'$user)
  90.             ;
  91.         }
  92.         return $qb->getQuery()->getOneOrNullResult();
  93.     }
  94.     /**
  95.      * Results for KnpPaginator.
  96.      */
  97.     public function getFranchises(): array
  98.     {
  99.         return $this->getFranchisesQuery()->getResult();
  100.     }
  101.     public function findByDomain(string $domain): ?Franchise
  102.     {
  103.         return $this->createQueryBuilder('f')
  104.             ->join('f.domains''d')
  105.             ->where('d.url = :domain')
  106.             ->setParameter('domain'$domain)
  107.             ->setMaxResults(1)
  108.             ->getQuery()
  109.             ->getOneOrNullResult()
  110.         ;
  111.     }
  112.     public function getAll(): array
  113.     {
  114.         return $this->createQueryBuilder('f')
  115.             ->select('f.id''f.name')
  116.             ->orderBy('f.name''ASC')
  117.             ->getQuery()
  118.             ->getResult()
  119.         ;
  120.     }
  121. }