<?php
namespace App\Repository;
use App\Entity\Prayer;
use App\Service\StatutService;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr\Orx;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<Prayer>
*
* @method Prayer|null find($id, $lockMode = null, $lockVersion = null)
* @method Prayer|null findOneBy(array $criteria, array $orderBy = null)
* @method Prayer[] findAll()
* @method Prayer[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PrayerRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Prayer::class);
}
public function add(Prayer $entity, bool $flush = false): void
{
$this->getEntityManager()->persist($entity);
if ($flush) {
$this->getEntityManager()->flush();
}
}
public function remove(Prayer $entity, bool $flush = false): void
{
$this->getEntityManager()->remove($entity);
if ($flush) {
$this->getEntityManager()->flush();
}
}
// /**
// * @return Prayer[] Returns an array of Prayer objects
// */
// public function findByExampleField($value): array
// {
// return $this->createQueryBuilder('p')
// ->andWhere('p.exampleField = :val')
// ->setParameter('val', $value)
// ->orderBy('p.id', 'ASC')
// ->setMaxResults(10)
// ->getQuery()
// ->getResult()
// ;
// }
// public function findOneBySomeField($value): ?Prayer
// {
// return $this->createQueryBuilder('p')
// ->andWhere('p.exampleField = :val')
// ->setParameter('val', $value)
// ->getQuery()
// ->getOneOrNullResult()
// ;
// }
/**
* @return Prayer[] Returns an array of Prayer objects
*/
public function findBySearchQueries(array $searchQueries): array
{
// $today = (new \DateTime("now"))->format('Y-m-d H:i:s');
$qb = $this->createQueryBuilder('p');
$qb
->leftJoin('p.prayings', 'prayings')
->leftJoin('prayings.customer', 'prieurs')
->orderBy('p.created', 'DESC')
->andWhere("p.status =:status")
->andWhere(self::checkTemporarily($qb))
->setParameter('status', StatutService::PUBLISHED_VALUE);
$querySubject = $queryCity = $querySubjectDescription = $queryValidatedAt = null;
if (isset($searchQueries['subject']) and !empty($searchQueries['subject'])) {
$querySubject = $qb->expr()->like('p.title', $qb->expr()->literal("%{$searchQueries['subject']}%"));
$querySubjectDescription = $qb->expr()->like('p.description', $qb->expr()->literal("%{$searchQueries['subject']}%"));
}
if (is_array($searchQueries['validatedAt']) and count($searchQueries['validatedAt']) > 0){
if (isset($searchQueries['validatedAt']['before']) and isset($searchQueries['validatedAt']['after'])){
$queryValidatedAt = $qb->expr()->between(
'p.validatedAt',
$qb->expr()->literal($searchQueries['validatedAt']['before']),
$qb->expr()->literal($searchQueries['validatedAt']['after'])
);
}
}
$qb->andWhere($qb->expr()->orX(
$querySubject,
$querySubjectDescription,
$queryCity,
$queryValidatedAt
));
return $qb->getQuery()
->getResult();
}
public static function checkTemporarily(QueryBuilder $qb): Orx
{
return $qb->expr()->orX(
$qb->expr()->eq('p.isTemporarily', $qb->expr()->literal(false)),
$qb->expr()->andX(
$qb->expr()->eq('p.isTemporarily', $qb->expr()->literal(true)),
$qb->expr()->between(
'NOW()',
'p.datePublishStart',
'p.datePublishEnd'
)
)
);
}
/**
* @return Prayer[] Returns an array of Prayer objects
*/
public function getLastPrayer(?int $limit = 10): array
{
$qb = $this->createQueryBuilder('p');
$qb->andWhere(self::checkTemporarily($qb))
->andWhere("p.status =:status")
->orderBy('p.created', 'DESC')
->setParameter('status', StatutService::PUBLISHED_VALUE)
->setMaxResults($limit)
;
return $qb->getQuery()->getResult();
}
/**
* @return Prayer[] Returns an array of Prayer objects
*/
public function findValidatedPray(): array
{
$qb = $this->createQueryBuilder('p');
$expr = $qb->expr();
$qb
->andWhere($expr->andX(
$expr->eq('p.status', $expr->literal(StatutService::PUBLISHED_VALUE)),
$expr->between(
'p.validatedAt',
$expr->literal((new \DateTime('yesterday 12:00:00'))->format('Y-m-d H:i:s')),
$expr->literal((new \DateTime('now'))->format('Y-m-d H:i:s'))
)
))
->orderBy('p.created', 'DESC')
;
return $qb->getQuery()->getResult();
}
}