Laravel: How to verify if model was changed

11,782

Solution 1

First of all instead of:

$user->save

you should rather use:

$user->save();

And to verify if anything was changes in latest Laravel you can use:

if ($user->wasChanged()) {
    // do something
}

but be aware this is as far as I remember in Laravel 5.5

Solution 2

You could also skip the save altogether and check if your model ->isDirty(), before calling ->save() at all.

// ...
$user->title = $request->input('title');

if ($user->isDirty()) {
    $user->save();
}

Besides isDirty(), you also have isClean(), and more.

Check out: HasAttributes trait

Share:
11,782

Related videos on Youtube

Adam
Author by

Adam

I am big fan of character design, first-order logic and set theory.

Updated on June 04, 2022

Comments

  • Adam
    Adam almost 2 years

    Is there a simple way for the Eloquent save method to check if a row has actually changed? Something like affected_rows for Eloquent?

    The only workaround that I found was from Laravel Eloquent update just if changes have been made to do:

    $user = Auth::user();
    
    $timestamp = $user->updated_at;
    
    $user->title = $request->input('title');
    ....
    
    $user->save();
    
    if($timestamp == $user->updated_at){
       // row was not updated.
    }
    

    But is this possible to find this out shorter, without the need of a $timestep variable and the check? I don't want to repeat that logic in every controller.

    I am looking for something like this:

    $user = Auth::user();
    
    $user->title = $request->input('title');
    ....
    
    if($user->save()){
       // row was updated.
    }
    

    But this does not work since $user->save returns true in both cases. Is there another way?

  • Adam
    Adam over 6 years
    Yes thank you I corrected it. I tried it and it works. One has to call $user->save() before $user->wasChanged().
  • Marcin Nabiałek
    Marcin Nabiałek over 6 years
    @Adam Yes, you normally run $user->save() and you can then run $user->wasChanged() to verify if it was changed. If you wanted to verify what was changed you have also method getChanges()
  • J0H4N_AC
    J0H4N_AC almost 6 years
    In Laravel 5.6, $user->update($request->all()) returns true
  • Adham shafik
    Adham shafik about 3 years
    Actually Laravel makes this check itself, before saving it checks if any changes have been done by calling isDirty(), if it returns false, no update is made.