<?php
namespace App\Repository;
use App\Entity\Items;
use Doctrine\ORM\Query;
use App\Entity\Etablissement;
use App\Entity\ItemsInsertion;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
/**
* @method Items|null find($id, $lockMode = null, $lockVersion = null)
* @method Items|null findOneBy(array $criteria, array $orderBy = null)
* @method Items[] findAll()
* @method Items[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class ItemsRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Items::class);
}
// /**
// * @return Items[] Returns an array of Items objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('i')
->andWhere('i.exampleField = :val')
->setParameter('val', $value)
->orderBy('i.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?Items
{
return $this->createQueryBuilder('i')
->andWhere('i.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
public function getNiveaux($typeOnglet) {
switch ($typeOnglet) {
case 'ecole':
$niveaux = [
'01-MATER' => "Maternelle",
'02-ELEM' => "Ecole élémentaire",
'03-PRIM' => "Les deux"
];
break;
case 'professionnel':
$niveaux = [
'LYCPRO-CAP-' => "CAP",
'LYCPRO-BACP-' => "Bac Pro",
'LYCPRO-FPC' => "Formation Pro Continue"
];
break;
default:
$niveaux = [
'000' => "AUCUN !!!"
];
break;
}
return $niveaux;
}
public function getFilieres($niveau = null) {
return $this->createQueryBuilder('i')
->join(ItemsInsertion::class, 'ii', Join::WITH, 'i.id = ii.pere')
->andWhere("i.formation = 'oui'")
->andWhere('i.niveau = 3')
->andWhere('i.id LIKE :niveau')
// ->andWhere($queryBuilder->expr()->like('i.id', ':niveau'))
->groupBy('i.id')
->orderBy('i.libelle', 'ASC')
->setParameter('niveau', $niveau . '%')
->getQuery()
->enableResultCache(3600)
->getResult()
;
}
public function getFilieresFiltred($niveau = null, $idsFiltresContexte = null) {
$q = $this->createQueryBuilder('i')
->join(ItemsInsertion::class, 'ii', Join::WITH, 'i.id = ii.pere')
->andWhere("i.formation = 'oui'")
->andWhere('i.niveau = 3')
->andWhere('i.id LIKE :niveau');
if(!is_null($idsFiltresContexte)) {
$q->andWhere('i.id IN (:idsFiltresContexte)')
->setParameter('idsFiltresContexte', $idsFiltresContexte);
}
$q->groupBy('i.id')
->orderBy('i.libelle', 'ASC')
->setParameter('niveau', $niveau . '%');
return $q->getQuery()
->enableResultCache(3600)
->getResult()
;
}
public function getDiplomes($niveau = null, array $filieres = null, $idsFiltresContexte = null) {
$q = $this->createQueryBuilder('i');
$q->join(ItemsInsertion::class, 'ii', Join::WITH, 'i.id = ii.identifiant');
$q->andWhere("i.formation = 'oui'");
$q->andWhere('i.niveau = 4');
if(!is_null($idsFiltresContexte)) {
$q->andWhere('i.id IN (:idsFiltresContexte)');
$q->setParameter('idsFiltresContexte', $idsFiltresContexte);
}
if ($filieres != null) {
$sql = "";
$n = count($filieres);
$i = 0;
foreach ($filieres as $filiere) {
$sql .= " i.id LIKE '$filiere%' ";
if(++$i < $n)
$sql .= " OR ";
}
$q->andWhere($sql);
} else {
$q->andWhere('i.id LIKE :niveau');
$q->setParameter('niveau', $niveau . '%');
}
$q->orderBy('i.libelle', 'ASC');
return $q->getQuery()
->enableResultCache(3600)
->getResult();
}
/**
* Renvoi la liste des LVx(A/B/C == 1/2/3) selon le niveau : COLLège, LYCée ou LYCéePRO
* @param string $lvx LV1 | LV2 | LV3
* @param string $niveau COLL | LYC | LYCPRO
* @param array $idsLanguesContexte Liste d'ids de langues pour filtrer les langues
*/
public function getLVx($lvx, $niveau, $idsLanguesContexte = null) {
switch ($niveau) {
case 'college': $codeNiveau = "COLL"; break;
case 'lycee': $codeNiveau = "LYC"; break;
case 'professionnel': $codeNiveau = "LYCPRO"; break;
default : return null;
}
$idLike = \sprintf("%s-LANG-%s-", $codeNiveau, $lvx);
$qb = $this->createQueryBuilder('i')
->andWhere('i.niveau = 4')
->andWhere('i.id LIKE :idLike')
->orderBy('i.libelle', 'ASC')
->setParameter('idLike', $idLike . '%');
if(!is_null($idsLanguesContexte)) {
$qb->andWhere('i.id IN (:idsLanguesContexte)');
$qb->setParameter('idsLanguesContexte', $idsLanguesContexte);
}
return $qb->getQuery()
->enableResultCache(3600)
->getResult()
;
}
/**
* Renvoi la liste des Enseignements de spécialité
*/
public function getEnseignementsDeSpecialite($idsEdsContexte = null) {
$idLike = "LYC-FORMA2021-SPEC-";
$qb = $this->createQueryBuilder('i')
->andWhere('i.niveau = 4')
->andWhere('i.id LIKE :idLike')
->orderBy('i.libelle', 'ASC')
->setParameter('idLike', $idLike . '%');
if(!is_null($idsEdsContexte)) {
$qb->andWhere('i.id IN (:idsEdsContexte)');
$qb->setParameter('idsEdsContexte', $idsEdsContexte);
}
return $qb
->getQuery()
->enableResultCache(3600)
->getResult()
;
}
/**
* Renvoi un Items[] en calculant le nbr d'étabs pour chaque item
* Identique à getFilieres
*/
public function getFilieresWithTotal($niveau = null) {
$qb = $this->createQueryBuilder('i');
$qb->select(
'i.id,
i.libelle,
i.libelleMEP,
i.texteDefaut,
i.onglet,
i.niveau,
i.formation,
i.options,
i.id,
i.maj,
COUNT(DISTINCT e.id) AS total'
)
->join(ItemsInsertion::class, 'ii', Join::WITH, 'i.id = ii.pere')
->join(Etablissement::class, 'e', Join::WITH, 'ii.etablissement = e.id')
->andWhere("i.formation = 'oui'")
->andWhere('i.niveau = 3')
->andWhere('i.id LIKE :niveau')
->groupBy('i.id')
->orderBy('i.libelle', 'ASC')
->setParameter('niveau', $niveau . '%');
$result = $qb
->getQuery()
->enableResultCache(3600 * 2)
->getResult();
// Hydrate the results to ensure they are `Item` entities with the `total` count
$arrayItems = [];
foreach ($result as $key => $row) {
$items = new Items();
foreach ($row as $itemAttribute => $itemValue) {
$func="set" . ucwords($itemAttribute);
$items->$func($itemValue);
}
$arrayItems[] = $items;
}
return $arrayItems;
}
}