Предположим, у меня есть следующие связанные таблицы:
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
обновляется?
Спасибо
Я закончил тем, что создал метод для использования вместо вызова 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();
}
Других решений пока нет …