2015-09-11 26 views
1

讓我們假設我有以下相關表:Laravel 5.1 - 對相關車型車型觀察者

pages 
---------------- 
id 
content 

visitors 
---------------- 
id 
name 

page_visitor 
---------------- 
page_id 
visitor_id 

正如你看到的,我們可以有三個表,其中pagesvisitors有許多一對多的關係。

我已經在pages模型類上成功實現了一個觀察者類,現在,我對頁表執行的操作在其他地方得到了體現。使用以下代碼:

class ElasticsearchPageObserver 
{ 
    private $elasticsearch; 

    public function __construct(ESClient $client) 
    { 
     $this->elasticsearch = $client; 
    } 

    public function created(Page $page) 
    { 
     $params = $page->buildElasticsearchParams(); 
     $response = $this->elasticsearch->index($params); 
    } 

    public function updated(Page $page) 
    { 
     $params = $page->buildElasticsearchParams(); 
     $response = $this->elasticsearch->index($params); 
    } 
} 

你明白了吧?

事實證明,當與頁表有一對多關係的表得到更新時,上述觀察者會觀察它。但不適用於多對多的關係(如上所述)。

那麼,現在我該怎麼辦呢? page_visitor獲得更新時如何做同樣的事情?

感謝

+0

很明顯,這是沒有辦法的。我必須在'page'內創建一個方法,並且每當我要附加到任何其他模型時調用它。 –

回答

0

我結束了創建一個方法來使用,而不是在每一個相關的類調用attach

// in page: 
public function attachTo($to, $id) 
    { 
     switch($to) { 
      case 'App\Models\Visitor': 
       $this->visitors()->attach($id); 
       break; 
      case 'App\Models\Banner': 
       $this->banners()->attach($id); 
       break; 
      case 'App\Models\AdBlock': 
       $this->adblocks()->attach($id); 
       break; 
      default: 
       return; 
     } 
     $this->indexInElasticsearch(); 
    }