我用一个例子来解释我的问题。
我的模型类是User
,观察者类是UserObserver
。
我在 UserObserver
的 updated
方法中添加了一些代码,该代码将在每次 User
模型 update
时运行使用函数。例如,只要 User
记录中发生更新,就应该调用 UserObserver
(如下)中的 updated
方法。
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
对象。那么,我如何利用我们的观察者类方法,无论它是使用 User
Model 对象还是 Builder
对象更新的?
问题是,我确实有一个现有的应用程序,一些模型正在更新,例如 User::where('id', 2)->update(['name'=>'Update Name'] );
。将 update 语句修改为 User::find(2)->update(['name'=>'Update Name']);
是一项艰巨的任务。
最佳答案
尝试如下:
User::where('id', 2)->first()->update(['name'=>'更新名称']);
此代码的一个问题是,如果您的数据库中没有 id = 2
的用户,那么您将得到 null
并且您将得到异常可能是在未定义的实体上调用更新。
因此您可以通过以下方式避免这种情况:
$user = User::where('id', 2)->first();
if(!empty($user)) {
$user->getModel()->update(['name'=>'更新名称']);
}
关于php - 使用查询生成器更新时 Laravel 模型观察者类不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35549377/