【问题标题】:Laravel: How to verify if model was changedLaravel:如何验证模型是否已更改
【发布时间】:2018-04-17 15:51:03
【问题描述】:

Eloquent save method 有没有一种简单的方法来检查一行是否实际发生了变化?像 affected_rows 这样的 Eloquent 吗?

我发现的唯一解决方法是从Laravel Eloquent update just if changes have been made 做:

$user = Auth::user();

$timestamp = $user->updated_at;

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

$user->save();

if($timestamp == $user->updated_at){
   // row was not updated.
}

但这是否可以在不需要$timestep 变量和检查的情况下更短地找到它?我不想在每个控制器中重复这个逻辑。

我正在寻找这样的东西:

$user = Auth::user();

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

if($user->save()){
   // row was updated.
}

但这不起作用,因为$user->save 在这两种情况下都会返回true。还有其他方法吗?

【问题讨论】:

    标签: php laravel laravel-5 eloquent laravel-5.5


    【解决方案1】:

    您也可以完全跳过保存并检查您的模型是否为->isDirty(),然后再调用->save()

    // ...
    $user->title = $request->input('title');
    
    if ($user->isDirty()) {
        $user->save();
    }
    

    除了isDirty(),您还有isClean(),等等。

    查看:HasAttributes trait

    【讨论】:

    • 实际上 Laravel 自己做这个检查,在保存之前检查是否通过调用 isDirty() 进行了任何更改,如果返回 false,则不进行更新。
    【解决方案2】:

    改为使用update() 来更新记录...

    $user = Auth::user();
    $userUpdated = $user->update($request->all());
    
    //Print number of updated rows...
    print($userUpdated);
    

    这将显示受影响的行数...

    【讨论】:

    • 在 Laravel 5.6 中,$user->update($request->all()) 返回 true
    【解决方案3】:

    首先代替:

    $user->save
    

    你应该使用:

    $user->save();
    

    为了验证最新的 Laravel 中是否有任何变化,您可以使用:

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

    但请注意,这是我在 Laravel 5.5 中所记得的

    【讨论】:

    • 是的,谢谢,我更正了。我试过了,它有效。必须在$user->wasChanged() 之前调用$user->save()
    • @Adam 是的,您通常运行$user->save(),然后您可以运行$user->wasChanged() 来验证它是否已更改。如果您想验证更改了什么,您还可以使用方法 getChanges()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2011-08-09
    • 2018-02-16
    相关资源
    最近更新 更多