/** * Listen on delete event. When Playlist model is deleted, delete all * associated songs. */ public static function boot() { parent::boot(); static::deleted(function ($playlist) { // Get song ids. $song_ids = $playlist->songs->pluck('id')->toArray(); if (!empty($song_ids)) { Song::destroy($song_ids); } }); }
/** * Save new tracks to db. */ private function syncUpdate($request, $service, $all_music) { foreach ($all_music as $playlist_name => $tracks) { // Get playlist. $playlist = Playlist::getPlaylist($playlist_name, ucfirst($service->name)); // If playlist not in DB - add. if (empty($playlist)) { $playlist = Auth::user()->playlists()->create(['name' => $playlist_name, 'service_id' => $service->id]); } // Get list of existing songs in db. $song_identifier_in_db = $this->extractPlaylistSongIds($playlist); foreach ($tracks as $track) { // If song already in db, skip and remove from array of existing ids. if (isset($song_identifier_in_db[$track->id])) { unset($song_identifier_in_db[$track->id]); continue; } // Create new song. $playlist->songs()->firstOrCreate(['title' => $track->title, 'song_identifier' => $track->id, 'image' => $track->artwork_url, 'url' => $track->permalink_url, 'song_created' => $track->created_at, 'service_id' => $service->id]); } // Check if any songs left in songs list from db. If so, remove thos songs from db. if (!empty($song_identifier_in_db)) { $song_identifier_in_db = collect($song_identifier_in_db); $ids = $song_identifier_in_db->keyBy('id')->keys(); Song::destroy($ids); } } // Delete deleted playlists including songs. Playlist::deletePlaylist(array_keys($all_music), $service->id); }