src/Repository/VilleRepository.php line 129

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * Copyright (C) Office National de Publication et de Communication - All Rights Reserved
  5.  *
  6.  * Unauthorized copying of this file, via any medium is strictly prohibited by law
  7.  * This file is proprietary and confidential
  8.  */
  9. namespace App\Repository;
  10. use App\Entity\Ville;
  11. use App\Entity\Region;
  12. use App\Service\Tools;
  13. use Doctrine\ORM\Query;
  14. use App\Entity\Departement;
  15. use App\Common\LieuInterface;
  16. use App\Entity\AncienneRegion;
  17. use App\Repository\Helper\CachedTrait;
  18. use Doctrine\Persistence\ManagerRegistry;
  19. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  20. /**
  21.  * @method null|Ville find($id, $lockMode = null, $lockVersion = null)
  22.  * @method null|Ville findOneBy(array $criteria, array $orderBy = null)
  23.  * @method Ville[]    findAll()
  24.  * @method Ville[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  25.  */
  26. final class VilleRepository extends ServiceEntityRepository
  27. {
  28.     use CachedTrait;
  29.     private const CACHE_LIFETIME 60;
  30.     public function __construct(ManagerRegistry $registry)
  31.     {
  32.         parent::__construct($registryVille::class);
  33.     }
  34.     public function createQueryBuilder($alias$indexBy null)
  35.     {
  36.         return parent::createQueryBuilder($alias$indexBy)
  37.             ->leftJoin("${alias}.coordonnees"'coordonnees')
  38.             ->addSelect('coordonnees');
  39.     }
  40.     public function findImportantes()
  41.     {
  42.         return $this->findBy([
  43.             'id' => [
  44.                 '20004'// Ajaccio
  45.                 '80021'// Aimens
  46.                 '25056'// Besançon
  47.                 '33063'// Bordeaux
  48.                 '14118'// Caen
  49.                 '51108'// Chalons-en-Champagne
  50.                 '63113'// Clermont-Ferrand
  51.                 '21231'// Dijon
  52.                 '59350'// Lille
  53.                 '87085'// Limoges
  54.                 '69300'// Lyon
  55.                 '13200'// Marseille
  56.                 '57463'// Metz
  57.                 '34172'// Montpellier
  58.                 '44109'// Nantes
  59.                 '45234'// Orléans
  60.                 '75100'// Paris
  61.                 '86194'// Poitiers
  62.                 '35238'// Rennes
  63.                 '76540'// Rouen
  64.                 '67482'// Strasbourg
  65.                 '31555'// Toulouse
  66.             ],
  67.         ], ['libelle' => 'ASC']);
  68.     }
  69.     public function findRelatifsAuLieu(LieuInterface $lieu, ?string $onglet null, ?array $idsVilleContexte null): array
  70.     {
  71.         $queryBuilder $this->createQueryBuilder('v');
  72.         $queryBuilder
  73.             ->orderBy('v.libelle''ASC')
  74.             ->andWhere($queryBuilder->expr()->isNotNull('v.libelle'));
  75.             // ->setMaxResults(7000);
  76.         // Force $lieu du type ville devenir un département
  77.         if ($lieu instanceof Ville) {
  78.             $lieu $lieu->getDepartement();
  79.         }
  80.         if ($lieu instanceof Departement) {
  81.             $queryBuilder
  82.                 ->andWhere($queryBuilder->expr()->eq('v.departement'':departement'))
  83.                 ->setParameter('departement'$lieu->getId());
  84.         }
  85.         if ($lieu instanceof AncienneRegion) {
  86.             $queryBuilder
  87.                 ->leftJoin('v.departement''d')
  88.                 ->andWhere($queryBuilder->expr()->eq('d.ancienneRegion'':ancienneRegion'))
  89.                 ->setParameter('ancienneRegion'$lieu);
  90.         }
  91.         if ($lieu instanceof Region) {
  92.             $queryBuilder
  93.                 ->leftJoin('v.departement''d')
  94.                 ->leftJoin('d.ancienneRegion''ac')
  95.                 ->andWhere($queryBuilder->expr()->eq('ac.region'':region'))
  96.                 ->setParameter('region'$lieu);
  97.         }
  98.         if ($onglet && in_array($ongletTools::getOngletsList())) {
  99.             $queryBuilder
  100.                 ->andWhere($queryBuilder->expr()->like('v.onglets'':onglet'))
  101.                 ->setParameter('onglet'sprintf('%%%s%%'$onglet));
  102.         }
  103.         if (!is_null($idsVilleContexte)) {
  104.             $queryBuilder
  105.                 ->andWhere($queryBuilder->expr()->in('v.id'':idsVilleContexte'))
  106.                 ->setParameter('idsVilleContexte'$idsVilleContexte);
  107.         }
  108.         return $queryBuilder
  109.             ->getQuery()
  110.             ->setHint(Query::HINT_FORCE_PARTIAL_LOADtrue)
  111.             ->enableResultCache(3600)
  112.             ->getResult();
  113.     }
  114.     public function findAllByTerm(string $termint $max): array
  115.     {
  116.         $term trim($term);
  117.         if (empty($term)) {
  118.             return [];
  119.         }
  120.         $villes $this->findAllByTermLike($term.'%'$max, []);
  121.         if (\count($villes) < $max) {
  122.             $newMax $max - \count($villes);
  123.             $notIn = [];
  124.             foreach ($villes as $ville) {
  125.                 $notIn[] = $ville->getId();
  126.             }
  127.             $villes array_merge(
  128.                 $villes,
  129.                 $this->findAllByTermLike('%'.$term.'%'$newMax$notIn)
  130.             );
  131.         }
  132.         return $villes;
  133.     }
  134.     public function getSlugs(): array
  135.     {
  136.         $list $this
  137.             ->createQueryBuilder('v')
  138.             ->select('v.slug')
  139.             ->getQuery()
  140.             ->getResult();
  141.         return array_map(static function ($value) {
  142.             return $value['slug'];
  143.         }, $list);
  144.     }
  145.     private function findAllByTermLike(string $termint $max, array $notIn): array
  146.     {
  147.         $term trim($term);
  148.         $term str_replace([' ''-'], '%'$term);
  149.         if (empty($term)) {
  150.             return [];
  151.         }
  152.         $queryBuilder $this->createQueryBuilder('v');
  153.         $queryBuilder
  154.             ->orderBy('v.libelle''ASC')
  155.             ->andWhere($queryBuilder->expr()->isNotNull('v.libelle'))
  156.             ->andWhere($queryBuilder->expr()->isNotNull('v.slug'))
  157.             ->andWhere(
  158.                 $queryBuilder->expr()->orX(
  159.                     $queryBuilder->expr()->like('v.libelle'':term'),
  160.                     $queryBuilder->expr()->like('v.codePostal'':term')
  161.                 )
  162.             )
  163.             ->setParameter('term'$term);
  164.         if (!empty($notIn)) {
  165.             $queryBuilder->andWhere($queryBuilder->expr()->notIn('v.id'$notIn));
  166.         }
  167.         return $queryBuilder
  168.             ->setMaxResults($max)
  169.             ->getQuery()
  170.             ->setHint(Query::HINT_FORCE_PARTIAL_LOADtrue)
  171.             ->useResultCache(trueself::CACHE_LIFETIME)
  172.             ->getResult();
  173.     }
  174.     public function findAllByEtablissement(): array
  175.     {
  176.         $queryBuilder $this->createQueryBuilder('v');
  177.         return $queryBuilder
  178.             ->leftJoin('v.departement''d')
  179.             ->leftJoin('d.etablissements''e')
  180.             ->addOrderBy('v.libelle''ASC')
  181.             ->Where("e.ville IS NOT NULL")
  182.             ->getQuery()
  183.             ->setHint(Query::HINT_FORCE_PARTIAL_LOADtrue)
  184.             ->useResultCache(trueself::CACHE_LIFETIME)
  185.             ->getResult();
  186.     }
  187. }