*/ public function getSongs(Playlist $playlist, ?User $user = null): Collection { throw_unless($playlist->is_smart, NonSmartPlaylistException::create($playlist)); $query = Song::query()->withMeta($user ?? $playlist->user); $playlist->rule_groups->each(static function (SmartPlaylistRuleGroup $group, int $index) use ($query): void { $clause = $index === 0 ? 'where' : 'orWhere'; $query->$clause(static function (Builder $subQuery) use ($group): void { $group->rules->each(static function (SmartPlaylistRule $rule) use ($subQuery): void { $subWhere = $rule->operator === SmartPlaylistRule::OPERATOR_IS_BETWEEN ? 'whereBetween' : 'where'; $subQuery->$subWhere(...$rule->toCriteriaParameters()); }); }); }); return $query->orderBy('songs.title')->get(); } }