Laravel:如何验证模型是否已更改

8

你是否知道Eloquent保存方法中有没有一种简单的方式来检查行是否实际上已经更改了?类似于Eloquent的affected_rows吗?

我找到的唯一解决方法是从Laravel Eloquent仅在更改后更新中执行以下操作:

$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。还有其他方法吗?
3个回答

20

首先,不是:

$user->save

你应该使用:

$user->save();

要验证最新的Laravel中是否有任何更改,您可以使用:

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

但要注意这是我记得的 Laravel 5.5 版本。


2
是的,谢谢,我已经纠正了它。我尝试了一下,它可以工作。在调用$user->wasChanged()之前,必须先调用$user->save() - Adam
2
@Adam 是的,通常你可以运行 $user->save(),然后你可以运行 $user->wasChanged() 来验证是否已更改。如果你想验证哪些内容已更改,你也可以使用 getChanges() 方法。 - Marcin Nabiałek

3
你也可以完全跳过保存步骤,只需在调用->save()之前检查你的模型是否->isDirty()
// ...
$user->title = $request->input('title');

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

除了`isDirty()`之外,您还有`isClean()`等其他方法。
请查看:HasAttributes trait

2
实际上,Laravel会在保存之前自行进行此检查,它会调用isDirty()方法来检查是否有任何更改,如果返回false,则不会进行更新。 - Adham shafik

0

不要使用 update() 来更新记录...

$user = Auth::user();
$userUpdated = $user->update($request->all());

//Print number of updated rows...
print($userUpdated);

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


1
在Laravel 5.6中,$user->update($request->all())返回true - J0H4N_AC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接