Cześć!
Czy istnieje jakaś sensowna różnica pomiędzy update i save?
A może ja zwyczajnie źle z tego korzystam?
namespace App\Services; use App\Resource as Resource; use Illuminate\Support\Facades\Auth; class ResourcesService { public function addResources1($userId, $wood, $stone, $food, $gold) { $resources = new Resource; $resources = $resources->where('userId', $userId)->update([ 'wood' => $wood, 'stone' => $stone, 'food' => $food, 'gold' => $gold, ]); } public function addResources2($userId, $wood, $stone, $food, $gold) { $resources = new Resource; $resources = $resources->where('userId', $userId)->first(); $resources->wood = $wood; $resources->stone = $stone; $resources->food = $food; $resources->gold = $gold; $resources->save(); } }
Save pozwala Ci odłożyć w czasie zapis do bazy i wykonać w dogodnym momencie, a update zapisuje natychmiast. Dodatkowo odpalają się różne eventy podczas update i save.
W prostych przypadkach, gdzie nie ma zawiłych relacji używaj update(), nie ma sensu rozpisywać tego do save tak jak zrobiłeś.
Jeżeli chodzi o przykład save() to wyobraź sobie jakiś złożony proces zakupowy, gdzie masz wiele relacji, ale zapis chcesz wykonać na sam koniec procesu np.
//Tworzysz instancje koszyka, wrzucasz to co już masz $cart = new Cart(); $cart->fill($request->all('name')); //Tworzysz adres, ale nie chcesz jeszcze zapisywać, żeby nie śmiecić w bazie i nie usuwać jak coś się nie uda //Tutaj zapewne była by jakaś logika w service layer, ale dla przykładu daje tak $address = new ClientAddress(); $address->fill($request->input('address')); //Kolejna relacja niezbędna przy utworzeniu koszyka $book = Book::find($request->book_id); //Rozpoczynamy transakcję, jeżeli coś pójdzie nie tak to cofamy bo nie możemy pozwolić na brakujące relacje DB::beginTransaction(); try { $cart->book()->associate($book); $address->save(); $cart->address()->associate($address); $cart->save(); } catch (\Exception $e) { //Coś nie wyszło, cofamy i wywalamy error DB::rollBack(); return false; } //Wszystko ok, cart z relacjami zostaje w bazie DB::commit(); return true;
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)