2015-08-03 158 views
3

我正在構建通知系統,並通過模型事件傳遞通知。一些通知取決於與模型關係發生的事情。Laravel模型關係和模型事件

例子:我有一個有一個項目模型:與用戶一對多的關係,

public function projectmanager() { 
    return $this->belongsToMany('User', 'project_managers'); 
} 

我想監視在我的項目模型事件這種關係的變化。目前,我正在做這個下面這樣做,

$dirtyAttributes = $project->getDirty(); 
foreach($dirtyAttributes as $attribute => $value) { 
    //Do something 
} 

這是運行在::updating事件模型,但只着眼於模型的屬性,而不是它的任何的關係數據,是有可能得到老關係數據和新的關係數據進行比較和處理?

+0

你有沒有發現這方面的任何解決方案? – ekstro

+0

我認爲這不可能。因爲具有關係的數據具有不同的保存模式(在你的情況下,可能有'ProjectManager'模型對嗎?)。儘管你可以發佈你如何保存'Project'模型嗎?你是保存關係還是單獨保存? –

回答

3

爲此,您應該使用observer class

這已經被this SO answer相當簡單地覆蓋了,儘管該答案使用稍微老一點的方法,其中類本身需要調用其觀察者。當前版本(5.3爲這個答案),文檔推薦登記在您的應用服務提供商,觀察者這在你的榜樣將類似於:

<?php 
namespace App\Providers; 

use App\Project; 
use App\Observers\ProjectObserver; 
use Illuminate\Support\ServiceProvider; 

class AppServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     Project::observe(ProjectObserver::class); 
    } 
} 

爲了評價新模式值和之間的差異舊值仍在關係數據庫中,Laravel提供了兩種方法:getDirty()getOriginal()

所以,你的觀察看起來是這樣的:

<?php 

namespace App\Observers; 

use App\Project; 

class ProjectObserver 
{ 
    /** 
    * Listen to the Project updating event. 
    * 
    * @param Project $project 
    * @return void 
    */ 
    public function updating(Project $project) 
    { 
     $dirtyAttribtues = $project->getDirty(); 
     $originalAttributes = $project->getOriginal(); 
     // loop over one and compare/process against the other 
     foreach ($dirtyAttributes as $attribute => $value) { 
      // do something with the equivalent entry in $originalAttributes 
     } 
    } 
}