<?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\Ville;
use App\Entity\Region;
use App\Service\Tools;
use Doctrine\ORM\Query;
use App\Entity\Departement;
use App\Common\LieuInterface;
use App\Repository\Helper\CachedTrait;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
/**
* @method null|Departement find($id, $lockMode = null, $lockVersion = null)
* @method null|Departement findOneBy(array $criteria, array $orderBy = null)
* @method Departement[] findAll()
* @method Departement[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
final class DepartementRepository extends ServiceEntityRepository
{
use CachedTrait;
private const CACHE_LIFETIME = 60;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Departement::class);
}
public function createQueryBuilder($alias, $indexBy = null)
{
return parent::createQueryBuilder($alias, $indexBy)
->leftJoin("${alias}.coordonnees", 'coordonnees')
->addSelect('coordonnees');
}
public function findRelatifsAuLieu(LieuInterface $lieu, string $onglet = null): array
{
$queryBuilder = $this
->createQueryBuilder('d')
->orderBy('d.libelle', 'ASC');
// Force $lieu devenir une région
if ($lieu instanceof Ville) {
$lieu = $lieu->getDepartement();
}
if ($lieu instanceof Departement) {
$lieu = $lieu->getRegion();
}
if ($lieu instanceof Region) {
// $queryBuilder
// ->leftJoin('d.ancienneRegion', 'ac')
// ->andWhere($queryBuilder->expr()->eq('ac.region', ':region'))
// ->setParameter('region', $lieu);
$queryBuilder
->andWhere($queryBuilder->expr()->eq('d.region', ':region'))
->setParameter('region', $lieu);
}
if ($onglet && in_array($onglet, Tools::getOngletsList())) {
$queryBuilder
->andWhere($queryBuilder->expr()->like('d.onglets', ':onglet'))
->setParameter('onglet', sprintf('%%%s%%', $onglet));
}
return $queryBuilder
->andWhere($queryBuilder->expr()->neq('d.id', ':id'))
->setParameter('id', 'BE')
->getQuery()
->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
->enableResultCache(3600)
->getResult();
}
public function findAllByTerm(string $term, int $max): array
{
$term = trim($term);
if (empty($term)) {
return [];
}
$queryBuilder = $this->createQueryBuilder('d');
return $queryBuilder
->orderBy('d.libelle', 'ASC')
->andWhere($queryBuilder->expr()->isNotNull('d.libelle'))
->andWhere($queryBuilder->expr()->isNotNull('d.slug'))
->andWhere(
$queryBuilder->expr()->orX(
$queryBuilder->expr()->like('d.libelle', ':term'),
$queryBuilder->expr()->like('d.id', ':term')
)
)
->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('d')
->select('d.slug')
->getQuery()
->getResult();
return array_map(static function ($value) {
return $value['slug'];
}, $list);
}
public function findAllByEtablissement(): array
{
$queryBuilder = $this->createQueryBuilder('d');
return $queryBuilder
->leftJoin('d.etablissements', 'e')
->addOrderBy('d.libelle', 'ASC')
->Where("e.departement IS NOT NULL")
->getQuery()
->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
->useResultCache(true, self::CACHE_LIFETIME)
->getResult();
}
}