【问题标题】:Laravel getDirty and getOriginal give same values on updatingLaravel getDirty 和 getOriginal 在更新时给出相同的值
【发布时间】:2017-03-16 08:15:54
【问题描述】:

使用Laravel 5.4

我有一个 Job 模型,它上面有一个具有不同状态的枚举字段。这些状态在许多不同的地方发生变化。我制作了一个 JobHistory 模型和迁移来跟踪这些变化。

在我的工作模型上,我定义了新的 laravel 5.4 跟踪 eloquent 事件的方式:

/**
 * The events that should be fired for eloquent actions
 *
 * @var array
 */
protected $events = [
    'updating' => JobChangedStatus::class
];

状态变化是这样完成的:

/**
 * Change the job status
 *
 * @param $status
 */
public function changeStatus($status)
{
    $this->update([
        'status' => $status,
    ]);
}

EventServiceProvider:

'App\Events\Jobs\JobChangedStatus' => [
  'App\Listeners\Jobs\CreateJobHistory',
],

CreateJobHistory 监听器:

$job = $event->job;

$jobHistory = new JobHistory();
$jobHistory->old_status = $job->getOriginal('status');
$jobHistory->new_status = $job->status;
$jobHistory->job()->associate($job);
$jobHistory->executor()->associate(Auth::user());
$jobHistory->save();

当我将工作状态从 New 更改为 In_progress

我的 JobHistory 表如下所示:

所以 new_status 和 old_status 都给出旧值。我尝试使用$job->getDirty(),但是当我打印它时,它只会返回一个空数组。

我做错了什么?

【问题讨论】:

  • 做了一个快速测试。我使用 $events 道具将事件映射到 Event 类,就像你做的那样。但是使用laravel.com/docs/5.4/events#event-subscribers 模式来设置监听器。无论如何,它对我有用——我可以访问原始属性值和当前属性值。会不会是你的听众在排队?
  • 除了我的回答,您可能还想查看this package 处理数据历史

标签: php laravel eloquent laravel-5.4


【解决方案1】:

通常我会在Observer 中实现这一点。看到这样的事件/监听器设置感觉有点尴尬。

在你的AppServiceProvider.php:

public function boot()
{
    App\Job::observe(App\Observers\JobObserver::class);
}

然后在App\Observers\JobObserver.php:

use App\Job;
use App\JobHistory;

class JobObserver{
    public function updating(Job $job)
    {
        $jobHistory = new JobHistory();
        $jobHistory->old_status = $job->getOriginal('status');
        $jobHistory->new_status = $job->status;
        $jobHistory->job()->associate($job);
        $jobHistory->executor()->associate(Auth::user());
        $jobHistory->save();
    }
}

对于雄辩的模型,使用观察者是最有意义的(只是我的看法)。我用于监听邮件事件、工作事件、可能的通知等的事件/监听器模型。

这可能对您的情况有所帮助的另一个原因是,如果事件正在排队而不是同步运行,您最终会遇到竞争条件,并且大多数情况下模型将被保存,这就是为什么 getDirty() 有没有钥匙。使用观察者,操作总是同步运行,您不会遇到时间问题。

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    相关资源
    最近更新 更多