我用一个例子来解释我的问题。
我的模型类是User
,观察者类是UserObserver
。
我在UserObserver
updated
方法中添加了一些代码,每次使用User
模型update
函数时,这些代码都会运行。例如updated
每当记录中发生更新时,都应调用UserObserver
(如下)中的方法User
。
class UserObserver{
function updated($userModel)
{
//Send mail code
}
}
UserObserver
中的代码在User
数据更新时起作用,如下所示:
User::find(2)->update(['name'=>'Update Name']);
但是,当User
数据按以下方式更新时,UserObserver
中的代码将不会运行:
User::where('id', 2)->update(['name'=>'Update Name']);
当我调试时,我可以理解User::find(2)
返回User
模型对象,User::where('id', 2)
将返回一个Builder
对象。那么,我如何使用我们的观察器类方法,无论它是使用 Model 对象还是Builder
对象更新User
?
问题是,我确实有一个现有的应用程序,某些模型正在像User::where('id', 2)->update(['name'=>'Update Name']);
一样更新。将更新语句修改为User::find(2)->update(['name'=>'Update Name']);
是一项艰巨的任务。
尝试如下:
User::where('id', 2)->first()->update(['name'=>'Update Name']);
此代码的一个问题是,如果您的数据库中没有具有id = 2
的用户,那么您将获得null
并且您将获得异常,例如在未定义的实体上调用更新。
因此,您可以按以下方式避免这种情况:
$user = User::where('id', 2)->first();
if(!empty($user)) {
$user->getModel()->update(['name'=>'Update Name']);
}
亲爱的观察者不依赖于模型对象或生成器对象。它适用于这两个语句...
User::find(2)
和
User::where('id', 2)
我昨天遇到了同样的问题,但是我上周一安装了可修订的软件包,当我探索该软件包时,它在我的代码上的工作"User::where('id', 2)"
.
实际上,我将代码放在 upating() 方法中,但是当我将相同的代码放在 saving() 方法中时,它对我有用......
用户模型类应该有一个可填充的变量。
class User extends Model
{
protected $fillable = ['name'];
}
尝试在 where 子句之后添加 first() 方法。
User::where('id', 2)->first()->update(['name'=>'Update Name']);
或者扭曲 where 子句以获取用户模型对象。
$user = User::where('id', 2)->first();
if(!$user) {
$user->update(['name'=>'Update Name']);
}