Класс обозревателя модели 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']);
}