'datetime', 'started_at' => 'datetime', 'finished_at' => 'datetime', 'status' => \App\Enums\OrderedSongStatus::class, ]; public function session() { return $this->belongsTo(RoomSession::class, 'room_session_id'); } public function song() { return $this->belongsTo(Song::class); } public function scopeWithPartialSong($query) { return $query->with([ 'song' => function ($q) { $q->select('id', 'name','filename','db_change','vocal','situation'); // 精簡版 } ]); } public function scopeForSession($query, $roomSessionId) { return $query->where('room_session_id', $roomSessionId); } public function scopePlaying($query) { return $query->where('status', OrderedSongStatus::Playing); } public function scopeNextSong($query) { return $query->whereIn('status', [OrderedSongStatus::InsertPlayback, OrderedSongStatus::NotPlayed]) ->orderByRaw("FIELD(status, ?, ?)", [ OrderedSongStatus::InsertPlayback->value, OrderedSongStatus::NotPlayed->value, ]) ->orderByRaw("CASE WHEN status=? THEN ordered_at END DESC", [OrderedSongStatus::InsertPlayback->value]) ->orderByRaw("CASE WHEN status=? THEN ordered_at END ASC", [OrderedSongStatus::NotPlayed->value]); } public function scopeFinished($query) { return $query->whereIn('status', [ OrderedSongStatus::Played, OrderedSongStatus::Skipped, OrderedSongStatus::NoFile, ])->orderByDesc('finished_at'); } }