2016-02-22 3 views
2

Я объясняю свою проблему примером.Класс наблюдателя модели 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 м odel и User::where('id', 2) вернет объект Builder. Итак, как я могу использовать наш метод класса наблюдателя независимо от того, обновляется ли он с использованием объекта модели User или объекта Builder?

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

+0

Может быть, стоит добавить код для обновления в UserObserver в вашем вопросе и код, который связывает два класса. – haakym

ответ

0

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

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']); }

+0

благодарим вас за быстрый ответ, в обоих случаях я могу обновить информацию о пользователе, но отправка почтового кода в «обновленном» методе UserObserver не работает, пока мы обновляем информацию пользователя, такую ​​как User :: where ('id', 2) -> update (['name' => 'Update Name']); –

+0

Вы написали эту обновленную функцию в модели UserObserver? –

+0

У меня есть ответ. Пусть это поможет вам. –

0

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

User::find(2) 

и

User::where('id', 2) 

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

На самом деле я помещаю свой код в обновлении() метод, но когда я разместить один и тот же код в экономии() метод его работы для меня ...