koel/app/Repositories/GenreRepository.php

45 lines
1.3 KiB
PHP
Raw Normal View History

2022-10-21 20:06:43 +00:00
<?php
namespace App\Repositories;
use App\Models\Song;
use App\Values\Genre;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
class GenreRepository
{
/** @return Collection|array<array-key, Genre> */
public function getAll(): Collection
{
return Song::query()
->select('genre', DB::raw('COUNT(id) AS song_count'), DB::raw('SUM(length) AS length'))
->groupBy('genre')
->orderBy('genre')
->get()
->transform(static fn (object $record): Genre => Genre::make(
name: $record->genre ?: Genre::NO_GENRE,
songCount: $record->song_count,
length: $record->length
));
}
public function getOne(string $name): ?Genre
{
/** @var object|null $record */
$record = Song::query()
->select('genre', DB::raw('COUNT(id) AS song_count'), DB::raw('SUM(length) AS length'))
->groupBy('genre')
->where('genre', $name === Genre::NO_GENRE ? '' : $name)
->first();
return $record
? Genre::make(
name: $record->genre ?: Genre::NO_GENRE,
songCount: $record->song_count,
length: $record->length
)
: null;
}
}