<?php
namespace App\Repository\Hotels;
use App\Data\SearchhotelsData;
use App\Entity\Hotels\Hotels;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\QueryBuilder;
use Knp\Component\Pager\Pagination\PaginationInterface;
use Knp\Component\Pager\PaginatorInterface;
/**
* @method Hotels|null find($id, $lockMode = null, $lockVersion = null)
* @method Hotels|null findOneBy(array $criteria, array $orderBy = null)
* @method Hotels[] findAll()
* @method Hotels[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class HotelsRepository extends ServiceEntityRepository
{
/**
* @var PaginatorInterface
*/
private $paginator;
public function __construct(ManagerRegistry $registry, PaginatorInterface $paginator)
{
parent::__construct($registry, Hotels::class);
$this->paginator = $paginator;
}
/**
* @param $page
* @return PaginationInterface
*/
public function findHotelsByActivated($page): PaginationInterface
{
$query = $this->createQueryBuilder('h')
->select('h', 'c')
->leftJoin('h.cities', 'c')
->andWhere('h.activated = 1')
->andWhere('h.online = 1')
->orderBy('h.id', 'DESC')
->getQuery();
return $this->paginator->paginate(
$query,
$page,
16
);
}
/**
* @param SearchhotelsData $search
* @return PaginationInterface
*/
public function findSearch(SearchhotelsData $search): PaginationInterface
{
$query = $this->getSearchQuery($search)->getQuery();
return $this->paginator->paginate(
$query,
$search->page,
16
);
}
private function getSearchQuery(SearchhotelsData $search, $ignorePrice = false): QueryBuilder{
$query = $this->createQueryBuilder('h')
->select('h', 'a', 'c')
->leftJoin('h.annonceshotels', 'a')
->leftJoin('h.cities', 'c')
->andWhere('h.activated = TRUE')
->andWhere('h.online = TRUE')
->orderBy('h.ordre', 'ASC')
;
if (!empty($search->q)){
$query = $query
->andWhere('h.name LIKE :q')
->setParameter('q', "%{$search->q}%")
;
}
if (!empty($search->ville)){
$query = $query
->andWhere('h.cities IN (:citie)')
->setParameter('citie', $search->ville)
;
}
if (!empty($search->min)){
$query = $query
->andWhere('a.price >= :min')
->setParameter('min', $search->min)
;
}
if (!empty($search->max)){
$query = $query
->andWhere('a.price <= :max')
->setParameter('max', $search->max)
;
}
return $query;
}
public function getHotelRandom(Hotels $hotels, $limit)
{
return $this->createQueryBuilder('h')
->andWhere('h.id != :hotel')
->setParameter('hotel', $hotels)
->orderBy('RAND()')
->setMaxResults($limit)
->getQuery()
->getResult()
;
}
/**
* @return int|mixed|string|null
* @throws NonUniqueResultException
*/
public function featured()
{
return $this->createQueryBuilder('h')
->andWhere('h.online = 1')
->andWhere('h.activated = 1')
->orderBy('RAND()')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult()
;
}
// /**
// * @return Hotels[] Returns an array of Hotels objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('h')
->andWhere('h.exampleField = :val')
->setParameter('val', $value)
->orderBy('h.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?Hotels
{
return $this->createQueryBuilder('h')
->andWhere('h.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}