【问题标题】:Handling events only when model properties/columns are updated - Laravel Observer仅在模型属性/列更新时处理事件 - Laravel 观察者
【发布时间】:2017-10-16 22:04:09
【问题描述】:

我在这里处理模型的两个事件,更新和更新,如下面的代码所示。我担心的是,只有当teacherId已更改时,我才想在更新的事件中执行一些任务,因此我想检查更新事件中的值并使用类属性来了解它是否已更改,但该标志假设其定义的值,总是返回 false。

namespace App\Observers;

class SubjectObserver {

private $shouldUpdateThreads = false;

/**
 * Listen to the ThreadList created event.
 * This events Fire when ThreadList is handled
 * @param \App\Observers\App\ThreadList $threadList
 */
public function created(\subject $subject) {

}

/**
 * Listen to the ThreadList saved event.
 * @param \App\Observers\App\ThreadList $threadList
 */
public function saved(\subject $subject) {

}

/**
 * Handling subject updated event 
 * Used to update the threads and related models
 * @param \subject $subject
 */
public function updated(\subject $subject) {
    info('After Update Event ' . $this->shouldUpdateThreads);
    if ($this->shouldUpdateThreads) {
        info_plus($subject);
    }
    info('After Update Check');
}

/**
 * Handling subject being updated event
 * Used to check if the teachers data has changed or not
 * @param \subject $subject
 */
public function updating(\subject $_subject) {

    $subject = \subject::find($_subject->id);

    $this->shouldUpdateThreads = ($subject->teacherId != $_subject->teacherId) ? true : false;

    info(($subject->teacherId != $_subject->teacherId));

    info("Thread update ? " . $this->shouldUpdateThreads);
}

public function deleted(\subject $subject) {
    info("Subject deleted");
}

}

这甚至是正确的方法吗?如果不是我做错了什么?

【问题讨论】:

    标签: laravel model eloquent observers laravel-events


    【解决方案1】:

    在 Eloquent 模型中,您可以在更新属性时使用 getOriginal 方法。 因此,如果您想获得teacherId 的原始值(更新前),您可以这样做:

    $subject->getOriginal('teacher_id');
    

    https://laravel.com/api/5.5/Illuminate/Database/Eloquent/Model.html#method_getOriginal

    在您的代码中:

    public function updated(\subject $subject) {
        info('After Update Event ' . $this->shouldUpdateThreads);
        if ($subject->getOriginal('teacher_id') !== $subject->teacher_id) {
            info_plus($subject);
        }
        info('After Update Check');
    }
    

    【讨论】:

    • 酷让我试试看:)
    • 这对我来说似乎很好,谢谢
    猜你喜欢
    • 2023-01-24
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2021-06-30
    • 2017-05-30
    • 2021-09-26
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多