<?php
namespace FlexApp\Repository;
use DateInterval;
use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Doctrine\Persistence\ManagerRegistry;
use Exception;
use FlexApp\Entity\CommentEntity;
use WebBundle\Traits\RepoTrait;
/**
* @method CommentEntity|null find($id, $lockMode = null, $lockVersion = null)
* @method CommentEntity|null findOneBy(array $criteria, array $orderBy = null)
* @method CommentEntity[] findAll()
* @method CommentEntity[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class CommentRepository extends ServiceEntityRepository
{
use RepoTrait;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, CommentEntity::class);
}
public function getMissingPortalCommentsArray($portalUnids): array
{
$queryBuilder = $this->createQueryBuilder('c');
$missingPortalComments = $queryBuilder
->where($queryBuilder->expr()->notIn('c.unid', $portalUnids))
->orWhere($queryBuilder->expr()->isNull('c.unid'))
->getQuery()
->getResult();
$resultArray = [];
/** @var CommentEntity $comment */
foreach ($missingPortalComments as $comment) {
$resultArray[] = $comment->toArray();
}
return $resultArray;
}
public function getComments(string $unid, string $locale, string $sort, ?int $category = null): ?array
{
$query = $this->createQueryBuilder('c')
->leftJoin('c.user', 'user')
->addSelect('user')
->andWhere('c.locale = :locale')
->setParameter('locale', $locale);
if ($category) {
$query
->andWhere('c.category = :category')
->setParameter('category', $category)
;
}
if ($unid) {
$query->andWhere('c.commentableUnid = :unid')
->setParameter('unid', $unid);
}
$r = $query->orderBy('c.createdAt', strtoupper($sort))
->getQuery()
->useQueryCache(true);
return $r->getResult();
}
public function getCommentCountData(string $unid, string $locale, ?bool $answer = true): int
{
$query = $this->createQueryBuilder('c')
->select('COUNT(c.id)')
->leftJoin('c.user', 'user')
->andWhere('c.locale = :locale')
->andWhere('c.category = :category')
->andWhere('c.commentableUnid = :unid')
->setParameters([
'category' => 1,
'locale' => $locale,
'unid' => $unid,
'foreignAlias' => ''
]);
if ($answer) {
$query->andWhere('user.foreignAlias IS NOT NULL AND user.foreignAlias <> :foreignAlias');
} else {
$query->andWhere('user.foreignAlias IS NULL OR user.foreignAlias <> :foreignAlias');
}
$r = $query->getQuery();
try {
return $r->getSingleScalarResult();
} catch (NoResultException|NonUniqueResultException $e) {
return 0;
}
}
/**
* количество комментариев по $unid + $locale.
*
* @param $locale
* @param $unid
*
* @return int|mixed
*
* @throws NonUniqueResultException
* @throws NoResultException
*/
public function getCountPublicationsByUnid($locale, $unid)
{
$q = $this->createQueryBuilder('c')
->select('count(c.id)')
->andWhere('c.locale = :locale')
->setParameter('locale', $locale)
->andWhere('c.commentableUnid = :unid')
->setParameter('unid', $unid);
$r = $q->getQuery()
->useQueryCache(true);
return $r->getSingleScalarResult();
}
/**
* получить количество комментариев по темам
*
* @param $locale
*
* @return array|null
*/
public function getCountPublications($locale)
{
$query = $this->createQueryBuilder('c')
->select('c.commentableUnid, count(c.id)')
->andWhere('c.locale = :locale')
->setParameter('locale', $locale)
->groupBy('c.commentableUnid');
$r = $query->getQuery();
return $r->getArrayResult();
}
/**
* @return mixed
*
* @throws Exception
*/
public function getCommentsByNameAndBodyAndLocaleLastTime(string $name, string $body, string $locale, int $interval)
{
$query = $this->getEntityManager()->createQuery("
SELECT c
FROM FlexApp\Entity\CommentEntity c
WHERE c.name = :name
AND c.body = :body
AND c.locale = :locale
AND c.createdAt > :date_begin
");
$query->setParameter('name', $name);
$query->setParameter('body', $body);
$query->setParameter('locale', $locale);
$query->setParameter('date_begin', $this->generateDateBegin($interval));
return $query->getResult();
}
/**
* @return DateTime
*
* @throws Exception
*/
private function generateDateBegin(int $interval)
{
$dateTime = new DateTime();
$dateTime->sub(new DateInterval(sprintf('PT%sM', $interval)));
return $dateTime;
}
}