【问题标题】:Laravel Model Events - perform actions on specific column updateLaravel 模型事件 - 对特定列更新执行操作
【发布时间】:2017-01-29 17:40:48
【问题描述】:

众所周知,Laravel 具有在某些实例上触发的模型事件,我们可以对它们执行操作,例如创建、创建、保存、保存等。我想知道的是我们如何知道哪一列更新了让我们说“已保存”事件,例如用户已更新,当然保存和保存的事件已被触发,在这些事件中可以知道哪一列已更新并相应地执行操作吗?提前致谢。

【问题讨论】:

  • 你可以钩入saving()方法并通过getDirty()方法检查。
  • 如果您使用的是timestamp。然后,当您插入或更新记录时,它会提及日期和时间。你会得到更多关于那里的信息 [laravel.com/docs/5.3/eloquent]

标签: php laravel laravel-5


【解决方案1】:

正如@Joel Hinz 所说,您可以使用getDirty() 方法。

getDirty() - 获取自上次同步以来已更改的属性

此方法将返回一个包含已更改列名称的数组:

public function boot()
{
    User::saving(function ($user) {
        $columns = $user->getDirty();

        foreach ($columns as $column => $newValue) {
            echo $column; // One of the changed columns.
        }
    });
}

【讨论】:

    【解决方案2】:

    老问题,但我找到了,我有更好的解决方案。

    使用$model->wasChanged('FIELD_NAME')

    如果上次保存时更改了字段,这将返回真/假。

    如果你把它和引导方法结合起来:

    public static function boot()
        {
            /*
            static::creating(function ($model) {
                Log::emergency('creating');
            });
    
            static::updating(function ($model) {
                Log::emergency('updating');
            });
    
            static::deleting(function ($model) {
                Log::emergency('deleting');
            });
            */
            static::updated(static function ($model) {
                if ($model->wasChanged('FIELD_NAME')) {
                  // YOUR CODE
                }
            });
            parent::boot();
        }
    

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 2014-12-29
      • 2017-05-08
      • 1970-01-01
      相关资源
      最近更新 更多