3

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

我的模型类是User,观察者类是UserObserver

我在每次使用模型函数时都会运行的updated方法中添加了一些代码。例如,只要记录中发生更新,就应该调用(下面)中的示例方法。UserObserverUserupdateupdatedUserObserverUser

class UserObserver{
   function updated($userModel)
   {
      //Send mail code
   }
}

UserObserver数据更新时的工作代码User如下所示:

User::find(2)->update(['name'=>'Update Name']);

但是,当数据以下列方式更新时,其中的代码UserObserver将不会运行:User

User::where('id', 2)->update(['name'=>'Update Name']);

当我调试时,我可以理解User::find(2)返回User模型对象User::where('id', 2)并将返回一个Builder对象。那么,无论是使用User模型对象还是Builder对象更新,我如何才能使用我们的观察者类方法呢?

问题是,我确实有一个现有的应用程序,其中一些模型正在更新,例如User::where('id', 2)->update(['name'=>'Update Name']);. 将 update 语句修改为User::find(2)->update(['name'=>'Update Name']);.

4

3 回答 3

0

尝试如下:

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']); }

于 2016-02-22T12:05:15.480 回答
0

用户模型类应该有一个可填充的变量。

class User extends Model
{
   protected $fillable = ['name'];
}

尝试在 where 子句之后添加first()方法。

User::where('id', 2)->first()->update(['name'=>'Update Name']);

或者扭曲 where 子句来获取User模型对象。

$user = User::where('id', 2)->first();
if(!$user) {
     $user->update(['name'=>'Update Name']);
}
于 2020-04-18T22:38:35.130 回答
0

亲爱的观察者不依赖模型对象或生成器对象。它适用于两种陈述......

User::find(2)

User::where('id', 2)

我昨天遇到了同样的问题,但是我在上周一安装了可修改的包,当我探索那个包时,它在我的代码上工作"User::where('id', 2)"

实际上我将我的代码放在updated()方法中,但是当我将相同的代码放在save()方法中时,它对我有用......

于 2016-02-25T04:34:46.563 回答