'', 'name' => '', 'adddate' => '', 'filename' => '', 'language_type' => '', 'db_change' => 0, 'vocal' => true, 'situation' => '', 'copyright01' => '', 'copyright02' => '', 'note01' => '', 'note02' => '', 'note03' => '', 'note04' => '', 'enable' => true, ]; public function rules() { return [ 'fields.name' => 'required|string|max:255', 'fields.adddate' => 'required|date', // 或 required, 依照你的需求 'fields.filename' => 'required|string|max:255', 'fields.language_type'=> ['required',new Enum(SongLanguageType::class)], 'fields.vocal' => 'required|boolean', 'fields.situation' => ['required',new Enum(SongSituation::class)], 'fields.copyright01' => 'nullable|string|max:255', 'fields.copyright02' => 'nullable|string|max:255', 'fields.note01' => 'nullable|string|max:255', 'fields.note02' => 'nullable|string|max:255', 'fields.note03' => 'nullable|string|max:255', 'fields.note04' => 'nullable|string|max:255', 'fields.enable' => 'required|boolean', // 如果你在表單中也綁定了 selectedArtists / selectedCategories: 'selectedArtists' => 'required|array', 'selectedArtists.*' => 'integer|exists:artists,id', 'selectedCategories' => 'nullable|array', 'selectedCategories.*'=> 'integer|exists:song_categories,id', ]; } public function mount() { $this->songCategories = SongCategory::all(); $this->songLanguageType = collect(SongLanguageType::cases())->map(fn ($languageType) => [ 'name' => $languageType->labels(), 'value' => $languageType->value, ])->toArray(); $this->songSituation = collect(SongSituation::cases())->map(fn ($situation) => [ 'name' => $situation->labels(), 'value' => $situation->value, ])->toArray(); $this->canCreate = Auth::user()?->can('song-edit') ?? false; $this->canEdit = Auth::user()?->can('song-edit') ?? false; $this->canDelect = Auth::user()?->can('song-delete') ?? false; } public function openModal($id = null) { $this->resetFields(); if ($id) { $song = Song::findOrFail($id); $this->songId = $song->id; $this->fields = $song->only(array_keys($this->fields)); $this->selectedCategories = $song->categories()->pluck('id')->toArray(); $this->selectedArtists = $song->artists()->pluck('id')->toArray(); //dd($this->fields,$this->selectedCategories,$this->selectedArtists); } $this->showModal = true; } public function closeModal() { $this->resetFields(); $this->showModal = false; } public function save() { $validated = $this->validate($this->rules()); if ($this->songId) { if ($this->canEdit) { $song = Song::findOrFail($this->songId); $song->update($this->fields); // ⭐ 同步多對多關聯 $song->artists()->sync($this->selectedArtists ?? []); $song->categories()->sync($this->selectedCategories ?? []); $this->notification()->send([ 'icon' => 'success', 'title' => '成功', 'description' => '歌曲已更新', ]); } } else { if ($this->canCreate) { $song = Song::create($this->fields); // ⭐ 同步多對多關聯 $song->artists()->sync($this->selectedArtists ?? []); $song->categories()->sync($this->selectedCategories ?? []); $this->notification()->send([ 'icon' => 'success', 'title' => '成功', 'description' => '歌曲已新增', ]); } } $this->resetFields(); $this->showModal = false; $this->dispatch('pg:eventRefresh-song-table'); } public function deleteSong($id) { if ($this->canDelect) { Song::findOrFail($id)->delete(); $this->notification()->send([ 'icon' => 'success', 'title' => '成功', 'description' => '歌曲已刪除', ]); } } public function resetFields() { foreach ($this->fields as $key => $value) { if($key == 'vocal' || $key == 'enable'){ $this->fields[$key] = true ; }else if($key == 'adddate'){ $this->fields[$key] = now()->format('Y-m-d'); }else if($key == 'db_change'){ $this->fields[$key]=0; }else{ $this->fields[$key] = '' ; } } $this->songId = null; } public function render() { return view('livewire.forms.song-form'); } }