src/Repository/ActualiteRepository.php line 202

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\Common\LieuInterface;
  11. use App\Common\QuoiInterface;
  12. use App\Entity\Actualite;
  13. use App\Entity\Etablissement;
  14. use App\Repository\Helper\LieuFilterTrait;
  15. use DateTime;
  16. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  17. use Doctrine\ORM\QueryBuilder;
  18. use Doctrine\Persistence\ManagerRegistry;
  19. /**
  20.  * @method null|Actualite find($id, $lockMode = null, $lockVersion = null)
  21.  * @method null|Actualite findOneBy(array $criteria, array $orderBy = null)
  22.  * @method Actualite[]    findAll()
  23.  * @method Actualite[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  24.  */
  25. final class ActualiteRepository extends ServiceEntityRepository
  26. {
  27.     use LieuFilterTrait;
  28.     public function __construct(ManagerRegistry $registry)
  29.     {
  30.         parent::__construct($registryActualite::class);
  31.     }
  32.     public function createQueryBuilderClientsOnly($alias$indexBy null): QueryBuilder
  33.     {
  34.         $builder $this->createQueryBuilder($alias$indexBy);
  35.         return $builder
  36.             ->innerJoin("${alias}.etablissement"'etablissement')
  37.             ->andWhere(
  38.                 $builder->expr()->orX(
  39.                     $builder->expr()->eq('etablissement.droitPageWeb'true),
  40.                     $builder->expr()->eq('etablissement.droitForfaitGX'true)
  41.                 )
  42.             )
  43.             ->orderBy("${alias}.datePublication"'DESC');
  44.     }
  45.     public function suprimmeDistantesParPeriode(DateTime $minDateTime $max, array $idsSauf): void
  46.     {
  47.         $builder $this->createQueryBuilder('a');
  48.         $builder
  49.             ->delete(Actualite::class, 'a')
  50.             ->andWhere($builder->expr()->isNotNull('a.idDistant'))
  51.             ->andWhere('a.datePublication BETWEEN :min AND :max')
  52.             ->setParameter('min'$min->format('Y-m-d H:i:s'))
  53.             ->setParameter('max'$max->format('Y-m-d H:i:s'));
  54.         if ($idsSauf) {
  55.             $builder->andWhere($builder->expr()->notIn('a.idDistant'$idsSauf));
  56.         }
  57.         $builder->getQuery()->execute();
  58.     }
  59.     public function findDistante(string $idDistantEtablissement $etablissement): ?Actualite
  60.     {
  61.         return $this
  62.             ->findOneBy([
  63.                 'idDistant' => $idDistant,
  64.                 'etablissement' => $etablissement,
  65.             ]);
  66.     }
  67.     public function findByQuoiLieu(QuoiInterface $quoi, ?LieuInterface $lieuint $limit): array
  68.     {
  69.         $idsCategorie $quoi->getIdsCategorie();
  70.         if (!$idsCategorie) {
  71.             return [];
  72.         }
  73.         $builder $this->createQueryBuilderClientsOnly('actualite');
  74.         $builder
  75.             ->innerJoin('etablissement.ville''ville')
  76.             ->innerJoin('ville.departement''departement')
  77.             ->innerJoin('departement.ancienneRegion''ancienneRegion')
  78.             ->innerJoin('ancienneRegion.region''region')
  79.             ->andWhere($builder->expr()->in('etablissement.categoriePrimaire'$idsCategorie))
  80.             ->setMaxResults($limit)
  81.             ->orderBy('actualite.datePublication''DESC');
  82.         if ($lieu) {
  83.             $this->addWhereLieuToQuery($builder$lieu);
  84.         }
  85.         return $builder
  86.             ->getQuery()
  87.             ->getResult();
  88.     }
  89.     public function findByLieu(LieuInterface $lieuint $limit 2, array $filter null$types null): array
  90.     {
  91.         $builder $this->createQueryBuilder('actualite');
  92.         $builder
  93.             ->innerJoin('actualite.etablissement''etablissement')
  94.             ->addSelect('etablissement'// gagner une req SQL pour récupérer l'id de l'étab de l'actu (depuis le TWIG)
  95.             ->innerJoin('etablissement.texteReferencement''texteReferencement'// gagner une req SQL car oneToOne
  96.             ->addSelect('texteReferencement')
  97.             ->innerJoin('etablissement.ville''ville')
  98.             ->innerJoin('ville.departement''departement')
  99.             ->innerJoin('departement.ancienneRegion''ancienneRegion')
  100.             ->innerJoin('ancienneRegion.region''region')
  101.             ->orderBy('actualite.datePublication''DESC');
  102.         if ($limit 0)
  103.             $builder->setMaxResults($limit);
  104.         
  105.         if ($lieu->getSlug() !="default") {
  106.             $this->addWhereLieuToQuery($builder$lieu);
  107.         }
  108.         if ($filter) {
  109.             $builder->andWhere($builder->expr()->in('actualite.etablissement'$filter));
  110.         }
  111.         if ($types) {
  112.             $builder->andWhere($builder->expr()->in('etablissement.type'$types));
  113.         }
  114.         return $builder
  115.             ->getQuery()
  116.             ->getResult();
  117.     }
  118.     public function countDepuis(DateTime $depuis, array $idsSauf = []): int
  119.     {
  120.         $builder $this->createQueryBuilderClientsOnly('a');
  121.         $builder
  122.             ->select($builder->expr()->count('a'))
  123.             ->where('a.datePublication >= :depuis')
  124.             ->setParameter('depuis'$depuis);
  125.         if ($idsSauf) {
  126.             $builder->andWhere($builder->expr()->notIn('a.id'$idsSauf));
  127.         }
  128.         return (int) $builder
  129.             ->getQuery()
  130.             ->getSingleScalarResult();
  131.     }
  132.     /**
  133.      * @return Actualite[] Returns an array of Actualite objects
  134.      */
  135.     public function getLast($limit 3)
  136.     {
  137.         $builder $this->createQueryBuilder('a');
  138.         $builder
  139.             ->innerJoin('a.etablissement''etablissement')
  140.             ->where($builder->expr()->eq('etablissement.videoPlus',true))
  141.             ->leftJoin('a.etablissement''e')
  142.             ->addSelect('e')
  143.             ->leftJoin('e.gestionnaire''g')
  144.             ->addSelect('g')
  145.             ->leftJoin("g.texteReferencement"'gtexteReferencement')
  146.             ->addSelect('gtexteReferencement')
  147.             
  148.             ->leftJoin("e.ville"'ville')
  149.             ->addSelect('ville')
  150.             ->leftJoin('ville.coordonnees''villeCoordonnees')
  151.             ->addSelect('villeCoordonnees')
  152.             ->leftJoin('ville.departement''departement')
  153.             ->addSelect('departement')
  154.             ->leftJoin('departement.coordonnees''departementCoordonnees')
  155.             ->addSelect('departementCoordonnees')
  156.             ->leftJoin('departement.ancienneRegion''ancienneRegion')
  157.             ->addSelect('ancienneRegion')
  158.             ->leftJoin('ancienneRegion.region''region')
  159.             ->addSelect('region')
  160.             ->leftJoin('region.pays''pays')
  161.             ->addSelect('pays')
  162.             ->leftJoin("e.categoriePrimaire"'categoriePrimaire')
  163.             ->addSelect('categoriePrimaire')
  164.             ->leftJoin("e.texteReferencement"'texteReferencement')
  165.             ->addSelect('texteReferencement')
  166.             ->setMaxResults($limit)
  167.             ->orderBy('a.datePublication''DESC')
  168.         ;
  169.         return $builder
  170.             ->getQuery()
  171.             ->getResult();        
  172.         
  173.         /*
  174.         return $this->createQueryBuilder('a')
  175.             // ->andWhere('a.datePublication >= CURRENT_TIMESTAMP()')
  176.             ->andWhere('a.etablissement IS NOT NULL')
  177.             ->orderBy('a.datePublication', 'DESC')
  178.             ->setMaxResults($limit)
  179.             ->getQuery()
  180.             ->getResult()
  181.         ;
  182.         */
  183.     }
  184. }