src/Repository/SongRepository.php line 79

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\EventTag;
  4. use App\Entity\History;
  5. use App\Entity\Song;
  6. use App\Entity\Tag;
  7. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. use Doctrine\ORM\NonUniqueResultException;
  10. use Doctrine\ORM\NoResultException;
  11. /**
  12. * @method Song|null find($id, $lockMode = null, $lockVersion = null)
  13. * @method Song|null findOneBy(array $criteria, array $orderBy = null)
  14. * @method Song[] findAll()
  15. * @method Song[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  16. */
  17. class SongRepository extends ServiceEntityRepository
  18. {
  19. public function __construct(ManagerRegistry $registry)
  20. {
  21. parent::__construct($registry, Song::class);
  22. }
  23. public function search(?string $search = '', ?int $tagId = 0)
  24. {
  25. $query = $this->createQueryBuilder('s');
  26. if (strlen($search)>0){
  27. $query->andWhere('s.name LIKE :search')
  28. ->setParameter('search', '%'.$search.'%');
  29. }
  30. if ($tagId>0){
  31. $query->leftJoin('s.tags', 't')
  32. ->andWhere('t.id = :tagId')->setParameter('tagId', $tagId);
  33. }
  34. $query->andWhere('s.deleted = false');
  35. return $query->orderBy('s.created', 'DESC')
  36. ->setMaxResults(Song::MAX_SONG_DISPLAY)
  37. ->getQuery()
  38. ->getResult()
  39. ;
  40. }
  41. public function allPathsExceptPaths(array $paths){
  42. return $this->createQueryBuilder('s')
  43. ->select("CONCAT(s.name, '.mp3') as song")
  44. ->where("CONCAT(s.name, '.mp3') NOT IN (:paths)")
  45. ->setParameter('paths', $paths)
  46. ->getQuery()->getResult();
  47. }
  48. /**
  49. * @param Tag $tag
  50. * @return mixed
  51. */
  52. public function getRandomFromTag(Tag $tag){
  53. try {
  54. return $this->createQueryBuilder('s')
  55. ->leftJoin('s.tags', 't')
  56. ->andWhere('t.id = :tagId and s.deleted = false')->setParameter('tagId', $tag->getId())
  57. ->addSelect('RAND() as HIDDEN rand')
  58. ->orderBy('rand')
  59. ->setMaxResults(1)
  60. ->getQuery()
  61. ->getSingleResult();
  62. } catch (NoResultException $e) {
  63. return null;
  64. } catch (NonUniqueResultException $e) {
  65. return null;
  66. }
  67. }
  68. public function getSongsHistoryForEventTag(EventTag $eventTag){
  69. $query = $this->createQueryBuilder('s')
  70. ->select('
  71. s,
  72. SumIfWithinLastXHours(h.created, 4) as HIDDEN last4h,
  73. SumIfWithinLastXHours(h.created, 6) as HIDDEN last6h,
  74. SumIfWithinLastXHours(h.created, 12) as HIDDEN last12h,
  75. SumIfWithinLastXHours(h.created, 24) as HIDDEN last24h,
  76. SumIfWithinLastXHours(h.created, 48) as HIDDEN last48h
  77. ')
  78. ->leftJoin('s.tags', 't')
  79. ->leftJoin('t.eventTags', 'et')
  80. ->leftJoin(History::class, 'h', 'WITH', 'h.song = s.id AND h.eventTag = et.id')
  81. ->where('et.id = :eventTagId and s.deleted = 0')->setParameter('eventTagId', $eventTag->getId())
  82. ->orderBy('last4h')
  83. ->addOrderBy('last6h')
  84. ->addOrderBy('last12h')
  85. ->addOrderBy('last24h')
  86. ->addOrderBy('last48h')
  87. ->groupBy('s.id');
  88. return $query->getQuery()->getResult();
  89. }
  90. /*
  91. public function findOneBySomeField($value): ?Song
  92. {
  93. return $this->createQueryBuilder('s')
  94. ->andWhere('s.exampleField = :val')
  95. ->setParameter('val', $value)
  96. ->getQuery()
  97. ->getOneOrNullResult()
  98. ;
  99. }
  100. */
  101. }