<?php
namespace App\Repository;
use App\Entity\EventTag;
use App\Entity\History;
use App\Entity\Song;
use App\Entity\Tag;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
/**
* @method Song|null find($id, $lockMode = null, $lockVersion = null)
* @method Song|null findOneBy(array $criteria, array $orderBy = null)
* @method Song[] findAll()
* @method Song[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class SongRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Song::class);
}
public function search(?string $search = '', ?int $tagId = 0)
{
$query = $this->createQueryBuilder('s');
if (strlen($search)>0){
$query->andWhere('s.name LIKE :search')
->setParameter('search', '%'.$search.'%');
}
if ($tagId>0){
$query->leftJoin('s.tags', 't')
->andWhere('t.id = :tagId')->setParameter('tagId', $tagId);
}
$query->andWhere('s.deleted = false');
return $query->orderBy('s.created', 'DESC')
->setMaxResults(Song::MAX_SONG_DISPLAY)
->getQuery()
->getResult()
;
}
public function allPathsExceptPaths(array $paths){
return $this->createQueryBuilder('s')
->select("CONCAT(s.name, '.mp3') as song")
->where("CONCAT(s.name, '.mp3') NOT IN (:paths)")
->setParameter('paths', $paths)
->getQuery()->getResult();
}
/**
* @param Tag $tag
* @return mixed
*/
public function getRandomFromTag(Tag $tag){
try {
return $this->createQueryBuilder('s')
->leftJoin('s.tags', 't')
->andWhere('t.id = :tagId and s.deleted = false')->setParameter('tagId', $tag->getId())
->addSelect('RAND() as HIDDEN rand')
->orderBy('rand')
->setMaxResults(1)
->getQuery()
->getSingleResult();
} catch (NoResultException $e) {
return null;
} catch (NonUniqueResultException $e) {
return null;
}
}
public function getSongsHistoryForEventTag(EventTag $eventTag){
$query = $this->createQueryBuilder('s')
->select('
s,
SumIfWithinLastXHours(h.created, 4) as HIDDEN last4h,
SumIfWithinLastXHours(h.created, 6) as HIDDEN last6h,
SumIfWithinLastXHours(h.created, 12) as HIDDEN last12h,
SumIfWithinLastXHours(h.created, 24) as HIDDEN last24h,
SumIfWithinLastXHours(h.created, 48) as HIDDEN last48h
')
->leftJoin('s.tags', 't')
->leftJoin('t.eventTags', 'et')
->leftJoin(History::class, 'h', 'WITH', 'h.song = s.id AND h.eventTag = et.id')
->where('et.id = :eventTagId and s.deleted = 0')->setParameter('eventTagId', $eventTag->getId())
->orderBy('last4h')
->addOrderBy('last6h')
->addOrderBy('last12h')
->addOrderBy('last24h')
->addOrderBy('last48h')
->groupBy('s.id');
return $query->getQuery()->getResult();
}
/*
public function findOneBySomeField($value): ?Song
{
return $this->createQueryBuilder('s')
->andWhere('s.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}