123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- <?php
- namespace App\Repository;
- use App\Entity\Film;
- use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
- use Doctrine\ORM\QueryBuilder;
- use Doctrine\Persistence\ManagerRegistry;
- /**
- * @method Film|null find($id, $lockMode = null, $lockVersion = null)
- * @method Film|null findOneBy(array $criteria, array $orderBy = null)
- * @method Film[] findAll()
- * @method Film[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
- */
- class FilmRepository extends ServiceEntityRepository
- {
- public function __construct(ManagerRegistry $registry)
- {
- parent::__construct($registry, Film::class);
- }
- public function findFilm($id): Film
- {
- $qb = $this->createQueryBuilder('f');
- $query = $qb
- ->select('f.titre', 'f.annee')
- ->where('f.id = :id')
- ->setParameter('id', $id)
- ->getQuery();
- return $query->getSingleResult();
- }
- public function queryFilmWithGenre(array $genreNames, int $page = 1, array $filters = []) : QueryBuilder
- {
- $qb = $this->queryFilter($page, $filters);
- $qb
- ->innerJoin('f.genres', 'g')
- ->addSelect('f');
- $qb
- ->andWhere($qb->expr()->in('g.name', ':genrenames'))
- ->setParameter('genrenames', $genreNames)
- ;
- return $qb;
- }
- public function findFilmWithGenre(array $genreNames): array
- {
- return $this->queryFilmWithGenre($genreNames)
- ->getQuery()
- ->getResult()
- ;
- }
- public function queryFilmWithReal(array $realisateursNames, int $page = 1, array $filters = []): QueryBuilder
- {
- $qb = $this->queryFilter($page, $filters);
- $qb
- ->leftJoin('f.realisateurs', 'rea')
- ->addSelect('f')
- ->andWhere($qb->expr()->in('rea.nomComplet', ':realisateurs'))
- ->setParameter('realisateurs', $realisateursNames)
- ;
- return $qb;
- }
- public function findFilmWithReal(array $realisateursNames): array
- {
- return $this->queryFilmWithReal($realisateursNames)
- ->getQuery()
- ->getResult()
- ;
- }
- public function findFilmWithRealLike($query): array
- {
- $qb = $this->createQueryBuilder('f');
- $qb
- ->innerJoin('f.realisateurs', 'r')
- ->addSelect('f');
- $qb
- ->where($qb->expr()->like('r.nomComplet', ':nomComplet'))
- ->setParameter('nomComplet', '%'.$query.'%');
- return $qb->getQuery()->getResult();
- }
- public function findFilmWithGenreLike($genreName): array
- {
- $qb = $this->createQueryBuilder('f');
- $qb
- ->innerJoin('f.genres', 'g')
- ->addSelect('f');
- $qb->where($qb->expr()->like('g.name', ':genreName'))
- ->setParameter('genreName', '%'.$genreName.'%');
- return $qb
- ->getQuery()
- ->getResult();
- }
- public function queryFilter(int $page = 1, array $filters = []): QueryBuilder
- {
- $qb = $this->createQueryBuilder('f')
- ->orderBy('f.'.($filters['sortBy'] ?? 'dateSubmited'), $filters['sortOrder'] ?? 'DESC')
- ;
- if (!empty($filters['userWantToView'])) {
- $qb
- ->leftJoin('f.usersWantToView', 'wan')
- ->andWhere($qb->expr()->in('wan', ':user'))
- ->setParameter('user', $filters['userWantToView'])
- ;
- }
- if (!empty($filters['limit'])) {
- $limit = (int)$filters['limit'];
- $qb->setFirstResult(($page * $limit) - $limit);
- $qb->setMaxResults($limit);
- }
-
- if (!empty($filters['note'])) {
- $qb
- ->andWhere('f.note >= :note')
- ->setParameter('note', $filters['note'])
- ;
- }
-
- if (!empty($filters['username'])) {
- $qb
- ->andWhere('f.authered = :authered')
- ->setParameter('authered', $filters['username'])
- ;
- }
- return $qb;
-
- }
- public function queryTous ($page = 1, array $filters = []): QueryBuilder
- {
- $qb = $this->queryFilter($page, $filters)
- ->leftJoin('f.authered', 'aut')->addSelect('aut')
- ->leftJoin('f.genres', 'gen')->addSelect('gen')
- ->leftJoin('f.realisateurs', 'rea')->addSelect('rea')
- ;
- return $qb;
- }
- public function findProchaines(): array
- {
- $date = new \DateTime('now');
- $interval = new \DateInterval("P20D");
- $interval->invert = 1;
- $date->add($interval);
- $qb = $this->createQueryBuilder('f');
- $qb
- ->leftJoin('f.authered', 'aut')->addSelect('aut')
- ->leftJoin('f.genres', 'gen')->addSelect('gen')
- ->leftJoin('f.realisateurs', 'rea')->addSelect('rea')
- ->where('f.dateSortie > :date')
- ->setParameter('date', $date)
- ->orderBy('f.dateSortie', 'ASC');
- return $qb
- ->getQuery()
- ->getResult();
- }
- public function findFilmWithExistentTitre(string $titre): array
- {
- return $this->createQueryBuilder('f')
- ->leftJoin('f.realisateurs', 'r')->addSelect('r')
- ->where('f.titre = :titre')
- ->setParameter('titre', $titre)
- ->getQuery()
- ->getResult()
- ;
- }
- public function findFilmInImdb(Film $film): array
- {
- $reals = [];
- foreach($film->getRealisateurs() as $real) {
- $reals[] = $real->getNomComplet();
- }
- $qb = $this->createQueryBuilder('f');
- $qb
- ->andWhere('f.titre = :titre')
- ->setParameter('titre', $film->getTitre())
- ->innerJoin('f.realisateurs', 'rea')
- ->andWhere($qb->expr()->in('rea.nomComplet', ':reals'))
- ->setParameter('reals', $reals)
- ;
- return $qb
- ->getQuery()
- ->getResult()
- ;
- }
- }
|