pp-planer/app/Models/Song.php

66 lines
1.6 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class Song extends Model
{
use HasFactory;
use SoftDeletes;
protected $fillable = [
'ccli_id',
'cts_song_id',
'title',
'author',
'copyright_text',
'copyright_year',
'publisher',
'has_translation',
'last_used_at',
];
protected function casts(): array
{
return [
'has_translation' => 'boolean',
'last_used_at' => 'datetime',
];
}
public function arrangements(): HasMany
{
return $this->hasMany(SongArrangement::class);
}
public function serviceSongs(): HasMany
{
return $this->hasMany(ServiceSong::class);
}
/**
* Letztes Service-Datum, in dem dieser Song verwendet wurde.
* Berechnet über die service_songs -> services Verknüpfung.
*/
public function lastUsedInService(): Attribute
{
return Attribute::get(function () {
$latestDate = $this->serviceSongs()
->join('services', 'services.id', '=', 'service_songs.service_id')
->max('services.date');
if ($latestDate === null) {
return null;
}
// SQLite gibt date-Spalten als 'YYYY-MM-DD 00:00:00' zurück
return substr((string) $latestDate, 0, 10);
});
}
}