Обработка событий только при обновлении свойств/столбцов модели - Laravel Observer

Здесь я имею дело с двумя событиями модели, обновлением и обновлением, как вы можете видеть в приведенном ниже коде. Меня беспокоит то, что я хочу выполнить какую-то задачу в обновленном событии, только если учительский идентификатор был изменен, поэтому я решил проверить значение в событии обновления и использовать свойство класса, чтобы узнать, было ли оно изменено или нет, но этот флаг всегда возвращает 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");
}

}

Это вообще правильный подход? если нет то что я делаю не так?


person BlackBurn027    schedule 17.05.2017    source источник


Ответы (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');
}
person René    schedule 17.05.2017
comment
Круто, попробую :) - person BlackBurn027; 17.05.2017
comment
Мне кажется, это прекрасно. Спасибо. - person BlackBurn027; 17.05.2017