<?php
namespace WebBundle\Repository;
use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Doctrine\Persistence\ManagerRegistry;
use FlexApp\Constant\TimeConstant;
use WebBundle\Entity\ReviewsCache;
use WebBundle\Helper\App;
use WebBundle\Traits\RepoTrait;
class ReviewsCacheRepository extends ServiceEntityRepository
{
use RepoTrait;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, ReviewsCache::class);
}
public function getReview(int $id): ?ReviewsCache
{
$q = $this->createQueryBuilder('r')
->select('r')
->andWhere('r.id = :id')
->setParameter('id', $id)
->setMaxResults(1)
->getQuery();
try {
return $q->getSingleResult();
} catch (NoResultException|NonUniqueResultException $e) {
return null;
}
}
/**
* @param DateTime $start
* @param DateTime|null $end
* @return array|null
*/
public function getReviewsPeriod($start, $end = null): array
{
$q = $this->createQueryBuilder('r')
->select('r')
->andWhere('r.date >= :start')
->setParameter('start', $start->getTimestamp());
if ($end) {
$q->andWhere('r.date <= :end')
->setParameter('end', $end->getTimestamp());
}
$r = $q->getQuery()->enableResultCache(TimeConstant::HOUR);
return $r->getArrayResult();
}
public function getReviews($param = []): array
{
$q = $this->createQueryBuilder('r')
->select('r')
->andWhere("r.star IN(4,5)")
->andWhere('r.id NOT IN(535,1271)');
if (App::getCurLocale() != 'ru') {
$q->andWhere('r.country != \'RU\'');
}
if (!empty($param['order'])) {
$q->orderBy($param['order']);
} else {
$q->orderBy('r.date', 'DESC');
}
if (!empty($param['limit'])) {
$q->setMaxResults($param['limit']);
}
if (!empty($param['start_with'])) {
$q->setFirstResult($param['start_with']);
}
if (!empty($param['lang'])) {
$q->andWhere('r.language = :lang')
->setParameter('lang', $param['lang']);
}
$r = $q->getQuery()->enableResultCache(TimeConstant::HOUR);
return $r->getArrayResult();
}
/**
* @return int|null
*/
public function getReviewsCount(): ?int
{
$q = $this->createQueryBuilder('r')
->select('count(r.id)')
->andWhere("r.star IN(4,5)")
->andWhere('r.id NOT IN(535,1271)');
if (App::getCurLocale() != 'ru') {
$q->andWhere('r.country != \'RU\'');
}
$r = $q->getQuery()->enableResultCache(TimeConstant::HOUR);
try {
return $r->getSingleScalarResult();
} catch (NonUniqueResultException $e) {
return null;
}
}
}