Laravel 5.1 - наблюдатель модели на относительных моделях

Предположим, у меня есть следующие связанные таблицы:

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

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

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

Как видите, у нас может быть три таблицы, в которых pages и visitors имеют отношение "многие ко многим".

Я успешно реализовал класс наблюдателя в классе модели 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?

Спасибо


person Milad.Nozari    schedule 11.09.2015    source источник
comment
Ну видимо никак. Мне нужно создать метод внутри page и вызывать его всякий раз, когда я хочу подключиться к любой другой модели.   -  person Milad.Nozari    schedule 11.09.2015


Ответы (1)


В итоге я создал метод для использования вместо вызова 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();
    }
person Milad.Nozari    schedule 11.09.2015