Laravel:如果在更新时更改了列,请使用Observer进行检查

时间:2018-02-14 17:43:38

标签: php mysql laravel-5

我正在使用Observer来观看用户是否已更新。

每当用户updated时,我想检查他的email是否已被更改。

这样的事情可能吗?

class UserObserver
{


    /**
     * Listen to the User created event.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function updating(User $user)
    {
      // if($user->hasChangedEmailInThisUpdate()) ?
    }

}

3 个答案:

答案 0 :(得分:10)

正如tadman在评论中已经说过,方法isDirty可以解决问题:

class UserObserver
{


    /**
     * Listen to the User created event.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function updating(User $user)
    {
      if($user->isDirty('email')){
        // email has changed
        $new_email = $user->email; 
        $old_email = $user->getOriginal('email');
      }
    }

}

答案 1 :(得分:2)

您不必再次从数据库中获取用户。以下应该起作用:

public function updating(User $user)
{
  if($user->isDirty('email')){
    // email has changed
    $new_email = $user->email; 
    $old_email = $user->getOriginal('email'); 
  }
}

答案 2 :(得分:0)

您应该使用 updating 模型事件而不是使用 updated 事件来将列更改与原始值进行比较。请看下面的代码。

AppServiceProvider.php

<?php

namespace App\Providers;

use App\Models\User;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        User::updated(function($user){
            $changes = array_diff($user->getOriginal(), $user->getAttributes());
            if(array_key_exists('email',$changes)){
                /* do your things. */
            }
        });
    }
}

说明:

  • 获得差异后,您需要使用 array_key_exists 检查电子邮件字段是否已更新。