PiousVenom
PiousVenom

Reputation: 6908

Calling save() on a model will update every row in the database

I've got the following function in a migration file. The migration is to add a new column, and then update the columns of the existing entries:

<?php

private function updatePlans()
{
    $plans = PlanProvider::query()->get();

    foreach ($plans as $plan) {
        $plan->num_adults = 1;

        if (stripos($plan->rate_name, 'couple') !== false) {
            $plan->num_adults = 2;
        }
        $plan->save();
    }
}

Now, what's happening here is that when I call save(), it's updating EVERY model, instead of the one inside the loop. I have a similar function for another migration, and it works as expected. Why would this update every model rather than just the one?

Upvotes: 0

Views: 95

Answers (3)

daud
daud

Reputation: 43

you can try this

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class PlanProvider extends Model
{

    protected $table = 'plan_provider';
    
    protected $guarded = [];
    public $timestamps = false;
}


private function updatePlans()
{
    $plans = PlanProvider::findOrFail(id);
    $plans->num_adults = 1;
    $plans->save();
    
    return redirect()->back();  
}

Upvotes: 0

Md Azizur Rahman
Md Azizur Rahman

Reputation: 375

 public function store(Request $request)
    {


        $this->validate($request,[
            'email' => 'required|email|unique:subscribers'
        ]);

        $subscriber = new Subscriber();
        $subscriber->email = $request->email;
        $subscriber->save();
        Toastr::success('You are Successfully Added Our Subscriber List:)','Success');
        return redirect()->back();

   }

Upvotes: 0

Musa
Musa

Reputation: 1379

$plans is a Collection that contains all your "plans". Your $plan->save(); is outside your if conditions, so obviously it updates every single row, no matter if it has 1 or 2 num_adults

Upvotes: 0

Related Questions