<?php
declare(strict_types=1);
/*
* Copyright (C) Office National de Publication et de Communication - All Rights Reserved
*
* Unauthorized copying of this file, via any medium is strictly prohibited by law
* This file is proprietary and confidential
*/
namespace App\Repository;
use App\Entity\Region;
use App\Service\Tools;
use Doctrine\ORM\Query;
use App\Repository\Helper\CachedTrait;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
/**
* @method null|Region find($id, $lockMode = null, $lockVersion = null)
* @method null|Region findOneBy(array $criteria, array $orderBy = null)
* @method Region[] findAll()
* @method Region[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
final class RegionRepository extends ServiceEntityRepository
{
use CachedTrait;
private const CACHE_LIFETIME = 60;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Region::class);
}
public function findAllVisibles(string $onglet = null): array
{
$queryBuilder = $this->createQueryBuilder('r');
if ($onglet && in_array($onglet, Tools::getOngletsList())) {
$queryBuilder
->andWhere($queryBuilder->expr()->like('r.onglets', ':onglet'))
->setParameter('onglet', sprintf('%%%s%%', $onglet));
}
return $queryBuilder
->addOrderBy('r.pays', 'DESC')
->addOrderBy('r.libelle', 'ASC')
->andWhere($queryBuilder->expr()->isNull('r.ancienne')) // on ignore les anciennes régions
->andWhere($queryBuilder->expr()->isNotNull('r.libelle'))
->andWhere($queryBuilder->expr()->isNotNull('r.slug'))
->getQuery()
->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
->useResultCache(true, self::CACHE_LIFETIME)
->getResult();
}
public function findAllByTerm(string $term, int $max): array
{
$term = trim($term);
if (empty($term)) {
return [];
}
$queryBuilder = $this->createQueryBuilder('r');
return $queryBuilder
->orderBy('r.libelle', 'ASC')
->andWhere($queryBuilder->expr()->isNull('r.ancienne')) // on ignore les anciennes régions
->andWhere($queryBuilder->expr()->isNotNull('r.libelle'))
->andWhere($queryBuilder->expr()->isNotNull('r.slug'))
->andWhere($queryBuilder->expr()->like('r.libelle', ':term'))
->andWhere('r.regionAdm IS NOT NULL')
->setParameter('term', $term.'%')
->setMaxResults($max)
->getQuery()
->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
->useResultCache(true, self::CACHE_LIFETIME)
->getResult();
}
public function getSlugs(): array
{
$list = $this
->createQueryBuilder('r')
->select('r.slug')
->getQuery()
->getResult();
return array_map(static function ($value) {
return $value['slug'];
}, $list);
}
// Retourne une liste triée e, supprimant la région DEFAULT et les libellés vides
public function findAll(): array
{
$queryBuilder = $this->createQueryBuilder('r');
return $queryBuilder
->orderBy('r.libelle', 'ASC')
->andWhere($queryBuilder->expr()->isNull('r.ancienne')) // on ignore les anciennes régions
->andWhere($queryBuilder->expr()->isNotNull('r.libelle'))
->andWhere($queryBuilder->expr()->isNotNull('r.slug'))
->andWhere("r.libelle != 'DEFAULT'")
// ->andWhere("r.id != 'AUTR'") // enseignement français à l'éranger
->andWhere("r.regionAdm IS NOT NULL")
->getQuery()
->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
->useResultCache(true, self::CACHE_LIFETIME)
->getResult();
}
public function findAllByEtablissement(): array
{
$queryBuilder = $this->createQueryBuilder('r');
return $queryBuilder
->leftJoin('r.etablissements', 'e')
->addOrderBy('r.libelle', 'ASC')
->andWhere("e.region IS NOT NULL")
->andWhere("r.ancienne IS NULL")
->getQuery()
// ->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
// ->useResultCache(true, self::CACHE_LIFETIME)
->getResult();
}
}