mcServerWebsite/app/src/Repository/ModRepository.php
Ploush c38193dc7f
All checks were successful
Build & Deploy / Validation, build et push (push) Successful in 8m16s
fix available dependances field issue and change constraintes
2026-06-14 10:40:27 +02:00

117 lines
3.4 KiB
PHP

<?php
namespace App\Repository;
use App\Entity\Mod;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<Mod>
*/
class ModRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Mod::class);
}
/**
* Retourne tous les mods qui ne sont pas une dépendance (directe ou indirecte)
* du mod passé en paramètre, et qui n'est pas le mod lui-même.
*/
public function findAvailableDependances(?Mod $mod): array
{
$excludedIds = [];
if ($mod !== null) {
$excludedIds = $this->collectDependentIds($mod, []);
$excludedIds[] = $mod->getId();
}
$qb = $this->createQueryBuilder('m');
if (!empty($excludedIds)) {
$qb->where('m.id NOT IN (:excludedIds)')
->setParameter('excludedIds', $excludedIds);
}
return $qb->getQuery()->getResult();
}
/**
* Collecte récursivement les IDs de toutes les dépendances d'un mod.
*
* @param int[] $visited IDs déjà visités (évite les cycles infinis)
* @return int[]
*/
private function collectDependencyIds(Mod $mod, array $visited): array
{
$ids = [];
foreach ($mod->getDependances() as $dependance) {
$depId = $dependance->getId();
// Evite les boucles infinies en cas de dépendances cycliques
if (in_array($depId, $visited, true)) {
continue;
}
$visited[] = $depId;
$ids[] = $depId;
$ids = array_merge($ids, $this->collectDependencyIds($dependance, $visited));
}
return $ids;
}
/**
* Collecte récursivement les IDs de tous les mods qui dépendent du mod donné
* (dépendances inverses, directes ou indirectes), via la relation `soumis`.
*
* @param int[] $visited IDs déjà visités (évite les boucles infinies)
* @return int[]
*/
private function collectDependentIds(Mod $mod, array $visited): array
{
$ids = [];
foreach ($mod->getSoumis() as $dependent) {
$depId = $dependent->getId();
// Evite les boucles infinies en cas de dépendants cycliques
if (in_array($depId, $visited, true)) {
continue;
}
$visited[] = $depId;
$ids[] = $depId;
$ids = array_merge($ids, $this->collectDependentIds($dependent, $visited));
}
return $ids;
}
// /**
// * @return Mod[] Returns an array of Mod objects
// */
// public function findByExampleField($value): array
// {
// return $this->createQueryBuilder('m')
// ->andWhere('m.exampleField = :val')
// ->setParameter('val', $value)
// ->orderBy('m.id', 'ASC')
// ->setMaxResults(10)
// ->getQuery()
// ->getResult()
// ;
// }
// public function findOneBySomeField($value): ?Mod
// {
// return $this->createQueryBuilder('m')
// ->andWhere('m.exampleField = :val')
// ->setParameter('val', $value)
// ->getQuery()
// ->getOneOrNullResult()
// ;
// }
}