FilmRepository.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\Film;
  4. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  5. use Doctrine\ORM\QueryBuilder;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. /**
  8. * @method Film|null find($id, $lockMode = null, $lockVersion = null)
  9. * @method Film|null findOneBy(array $criteria, array $orderBy = null)
  10. * @method Film[] findAll()
  11. * @method Film[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  12. */
  13. class FilmRepository extends ServiceEntityRepository
  14. {
  15. public function __construct(ManagerRegistry $registry)
  16. {
  17. parent::__construct($registry, Film::class);
  18. }
  19. public function findFilm($id): Film
  20. {
  21. $qb = $this->createQueryBuilder('f');
  22. $query = $qb
  23. ->select('f.titre', 'f.annee')
  24. ->where('f.id = :id')
  25. ->setParameter('id', $id)
  26. ->getQuery();
  27. return $query->getSingleResult();
  28. }
  29. public function queryFilmWithGenre(array $genreNames, int $page = 1, array $filters = []) : QueryBuilder
  30. {
  31. $qb = $this->queryFilter($page, $filters);
  32. $qb
  33. ->innerJoin('f.genres', 'g')
  34. ->addSelect('f');
  35. $qb
  36. ->andWhere($qb->expr()->in('g.name', ':genrenames'))
  37. ->setParameter('genrenames', $genreNames)
  38. ;
  39. return $qb;
  40. }
  41. public function findFilmWithGenre(array $genreNames): array
  42. {
  43. return $this->queryFilmWithGenre($genreNames)
  44. ->getQuery()
  45. ->getResult()
  46. ;
  47. }
  48. public function queryFilmWithReal(array $realisateursNames, int $page = 1, array $filters = []): QueryBuilder
  49. {
  50. $qb = $this->queryFilter($page, $filters);
  51. $qb
  52. ->leftJoin('f.realisateurs', 'rea')
  53. ->addSelect('f')
  54. ->andWhere($qb->expr()->in('rea.nomComplet', ':realisateurs'))
  55. ->setParameter('realisateurs', $realisateursNames)
  56. ;
  57. return $qb;
  58. }
  59. public function findFilmWithReal(array $realisateursNames): array
  60. {
  61. return $this->queryFilmWithReal($realisateursNames)
  62. ->getQuery()
  63. ->getResult()
  64. ;
  65. }
  66. public function findFilmWithRealLike($query): array
  67. {
  68. $qb = $this->createQueryBuilder('f');
  69. $qb
  70. ->innerJoin('f.realisateurs', 'r')
  71. ->addSelect('f');
  72. $qb
  73. ->where($qb->expr()->like('r.nomComplet', ':nomComplet'))
  74. ->setParameter('nomComplet', '%'.$query.'%');
  75. return $qb->getQuery()->getResult();
  76. }
  77. public function findFilmWithGenreLike($genreName): array
  78. {
  79. $qb = $this->createQueryBuilder('f');
  80. $qb
  81. ->innerJoin('f.genres', 'g')
  82. ->addSelect('f');
  83. $qb->where($qb->expr()->like('g.name', ':genreName'))
  84. ->setParameter('genreName', '%'.$genreName.'%');
  85. return $qb
  86. ->getQuery()
  87. ->getResult();
  88. }
  89. public function queryFilter(int $page = 1, array $filters = []): QueryBuilder
  90. {
  91. $qb = $this->createQueryBuilder('f')
  92. ->orderBy('f.'.($filters['sortBy'] ?? 'dateSubmited'), $filters['sortOrder'] ?? 'DESC')
  93. ;
  94. if (!empty($filters['userWantToView'])) {
  95. $qb
  96. ->leftJoin('f.usersWantToView', 'wan')
  97. ->andWhere($qb->expr()->in('wan', ':user'))
  98. ->setParameter('user', $filters['userWantToView'])
  99. ;
  100. }
  101. if (!empty($filters['limit'])) {
  102. $limit = (int)$filters['limit'];
  103. $qb->setFirstResult(($page * $limit) - $limit);
  104. $qb->setMaxResults($limit);
  105. }
  106. if (!empty($filters['note'])) {
  107. $qb
  108. ->andWhere('f.note >= :note')
  109. ->setParameter('note', $filters['note'])
  110. ;
  111. }
  112. if (!empty($filters['username'])) {
  113. $qb
  114. ->andWhere('f.authered = :authered')
  115. ->setParameter('authered', $filters['username'])
  116. ;
  117. }
  118. return $qb;
  119. }
  120. public function queryTous ($page = 1, array $filters = []): QueryBuilder
  121. {
  122. $qb = $this->queryFilter($page, $filters)
  123. ->leftJoin('f.authered', 'aut')->addSelect('aut')
  124. ->leftJoin('f.genres', 'gen')->addSelect('gen')
  125. ->leftJoin('f.realisateurs', 'rea')->addSelect('rea')
  126. ;
  127. return $qb;
  128. }
  129. public function findProchaines(): array
  130. {
  131. $date = new \DateTime('now');
  132. $interval = new \DateInterval("P20D");
  133. $interval->invert = 1;
  134. $date->add($interval);
  135. $qb = $this->createQueryBuilder('f');
  136. $qb
  137. ->leftJoin('f.authered', 'aut')->addSelect('aut')
  138. ->leftJoin('f.genres', 'gen')->addSelect('gen')
  139. ->leftJoin('f.realisateurs', 'rea')->addSelect('rea')
  140. ->where('f.dateSortie > :date')
  141. ->setParameter('date', $date)
  142. ->orderBy('f.dateSortie', 'ASC');
  143. return $qb
  144. ->getQuery()
  145. ->getResult();
  146. }
  147. public function findFilmWithExistentTitre(string $titre): array
  148. {
  149. return $this->createQueryBuilder('f')
  150. ->leftJoin('f.realisateurs', 'r')->addSelect('r')
  151. ->where('f.titre = :titre')
  152. ->setParameter('titre', $titre)
  153. ->getQuery()
  154. ->getResult()
  155. ;
  156. }
  157. public function findFilmInImdb(Film $film): array
  158. {
  159. $reals = [];
  160. foreach($film->getRealisateurs() as $real) {
  161. $reals[] = $real->getNomComplet();
  162. }
  163. $qb = $this->createQueryBuilder('f');
  164. $qb
  165. ->andWhere('f.titre = :titre')
  166. ->setParameter('titre', $film->getTitre())
  167. ->innerJoin('f.realisateurs', 'rea')
  168. ->andWhere($qb->expr()->in('rea.nomComplet', ':reals'))
  169. ->setParameter('reals', $reals)
  170. ;
  171. return $qb
  172. ->getQuery()
  173. ->getResult()
  174. ;
  175. }
  176. }