使用Laravel 5.4
我有一个作业模型,它上有一个枚举字段,具有不同的状态。这些状态在许多不同的地方都会发生变化。我建立了一个JobHistory模型并进行了迁移,以跟踪这些更改。
在我的工作模型上,我定义了跟踪雄辩事件的新的Laravel5.4方法:
/**
* 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(),但是当我打印它时,它只是返回一个空数组。
我做错什么了?
发布于 2019-01-04 19:46:00
通常,我会在观察者中实现这一点。看到这样的事件/侦听器设置有点尴尬。
在你的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()没有密钥。对于观察者,操作总是同步运行,您不会遇到计时问题。
https://stackoverflow.com/questions/42828565
复制相似问题