Laravel的模型观察器类在使用查询生成器进行更新时不起作用


Laravel's Model observer class is not working when updating using query builder

我用一个例子来解释我的问题。

我的模型类是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']);
}