2016-02-22 53 views
2

我正在用示例解釋我的問題。使用查詢生成器進行更新時,Laravel的Model觀察器類不起作用

我的模特班是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']); 

然而,當User數據以下列方式更新了UserObserver的代碼將不會運行:

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的'updated'方法中發送郵件代碼不起作用,而我們更新用戶信息,如User :: where('id',2) - > update(['name'=>'更新名稱']); –

+0

你已經在「UserObserver」模型中編寫了這個更新的函數? –

+0

我已更新答案。願它能幫助你。 –

0

親愛的觀察不依賴模型對象或生成器對象上。 它適用於兩個語句...

User::find(2) 

User::where('id', 2) 

昨天我面臨同樣的問題,但我安裝上週一revisionable包,當我探索包,其對我的工作代碼"User::where('id', 2)"

其實我把我的代碼更新()方法,但是當我相同的代碼它對我的工作......