Обработка событий только при обновлении свойств / столбцов модели - Laravel Observer
Здесь я имею дело с двумя событиями модели, которые обновляются и обновляются, как вы можете видеть в приведенном ниже коде. Меня беспокоит то, что я хочу выполнить какую-то задачу в обновленном событии только в том случае, если изменен teacherId, поэтому я решил проверить значение в событии обновления и использовать свойство класса, чтобы узнать, было ли оно изменено или нет, но этот флаг всегда возвращает ложь, принимая определенное значение.
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");
}
}
Это даже правильное назначение? если нет то что я делаю не так?
1 ответ
В красноречивых моделях вы можете использовать getOriginal
метод при обновлении атрибутов. Так что если вы хотите получить исходное значение (до обновления) teacherId
ты можешь сделать:
$subject->getOriginal('teacher_id');
См. https://laravel.com/api/5.4/Illuminate/Database/Eloquent/Model.html.
В вашем коде:
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');
}