Класс обозревателя модели Laravel не работает при обновлении с помощью построителя запросов

Я объясняю свою проблему на примере.

Мой модельный класс User и класс наблюдателя UserObserver,

Я добавил немного кода в updated метод UserObserver это будет работать каждый раз, когда User модель update функция используется. Например updated метод вUserObserver(ниже) должен вызываться всякий раз, когда происходит обновление в User запись.

class UserObserver{
   function updated($userModel)
   {
      //Send mail code
   }
}

Код в UserObserver работает когда User Обновление данных, как показано ниже:

User::find(2)->update(['name'=>'Update Name']);

Тем не менее, код в UserObserver не будет работать, когда User Данные обновляются следующим образом:

User::where('id', 2)->update(['name'=>'Update Name']);

Когда я отлаживаю, я могу понять, что User::find(2) вернуть User модельный объект и User::where('id', 2) вернет Builder объект. Итак, как я могу использовать наш метод класса наблюдателя независимо от того, обновляется ли он с помощью User Модельный объект или Builder объект?

Проблема в том, что у меня уже есть приложение, некоторые модели обновляются как User::where('id', 2)->update(['name'=>'Update Name']);, Это сложная задача, чтобы изменить оператор обновления для User::find(2)->update(['name'=>'Update Name']);,

2 ответа

Уважаемый наблюдатель не зависит от объекта Model или Builder Object. Это работает на обоих утверждениях...

User::find(2)

а также

User::where('id', 2)

Вчера я столкнулся с той же проблемой, но в прошлый понедельник я установил исправляемый пакет, и когда я изучаю этот пакет, он работает над моим кодом "User::where('id', 2)",

На самом деле я помещаю свой код в метод update (), но когда я помещаю тот же код в метод save (), его работа для меня...

Попробуйте как ниже:

User::where('id', 2)->first()->update(['name'=>'Update Name']);

Единственная проблема с этим кодом заключается в том, что если у вас нет пользователя с id = 2 в вашей базе данных, то вы получите null и вы получите, и исключение может быть как вызывающее обновление для неопределенной сущности.

Таким образом, вы можете избежать этого, как показано ниже:

$user = User::where('id', 2)->first(); if(!empty($user)) { $user->getModel()->update(['name'=>'Update Name']); }

Класс модели пользователя должен иметь заполняемую переменную.

class User extends Model
{
   protected $fillable = ['name'];
}

Попробуйте добавить метод first() после предложения where.

User::where('id', 2)->first()->update(['name'=>'Update Name']);

Или поверните предложение where, чтобы получить объект модели User.

$user = User::where('id', 2)->first();
if(!$user) {
     $user->update(['name'=>'Update Name']);
}
Другие вопросы по тегам