Laravel 5.1 - 相对模型的模型观察者

时间:2015-09-11 13:23:20

标签: php mysql eloquent laravel-5.1 observers

假设我有以下相关表格:

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更新时如何做同样的事情?

由于

1 个答案:

答案 0 :(得分: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();
    }