Красноречивое соединение / отсоединение / синхронизация срабатывает в любом случае?

У меня есть проект laravel, и мне нужно сделать некоторые вычисления сразу после того, как я сохраню модель и приложил к ней некоторые данные.

Есть ли какое-либо событие, которое запускается в laravel после вызова attach (или отсоединения / синхронизации)?

Нет, в «Красноречии» нет никаких отношений. Но вы можете легко сделать это самостоятельно (например, для Ticket belongsToMany Component отношение Ticket belongsToMany Component ):

 // Ticket model use App\Events\Relations\Attached; use App\Events\Relations\Detached; use App\Events\Relations\Syncing; // ... public function syncComponents($ids, $detaching = true) { static::$dispatcher->fire(new Syncing($this, $ids, $detaching)); $result = $this->components()->sync($ids, $detaching); if ($detached = $result['detached']) { static::$dispatcher->fire(new Detached($this, $detached)); } if ($attached = $result['attached']) { static::$dispatcher->fire(new Attached($this, $attached)); } } 

объект события так же просто, как это:

 <?php namespace App\Events\Relations; use Illuminate\Database\Eloquent\Model; class Attached { protected $parent; protected $related; public function __construct(Model $parent, array $related) { $this->parent = $parent; $this->related = $related; } public function getParent() { return $this->parent; } public function getRelated() { return $this->related; } } 

то основной слушатель как разумный пример:

  // eg. AppServiceProvider::boot() $this->app['events']->listen('App\Events\Relations\Detached', function ($event) { echo PHP_EOL.'detached: '.join(',',$event->getRelated()); }); $this->app['events']->listen('App\Events\Relations\Attached', function ($event) { echo PHP_EOL.'attached: '.join(',',$event->getRelated()); }); 

и использование:

 $ php artisan tinker >>> $t = Ticket::find(1); => <App\Models\Ticket> >>> $t->syncComponents([1,3]); detached: 4 attached: 1,3 => null 

Конечно, вы могли бы сделать это без создания объектов Event, но этот способ более удобен, гибкий и просто лучше.

Шаги для решения вашей проблемы:

  1. Создайте собственное отношение BelongsToMany
  2. В BelongsToMany настраивать отношения переопределять, отсоединять, синхронизировать и обновлять методы ExistingPivot
  3. При переопределении метода отправляйте желаемые события.
  4. Переопределить метод toMany () в Model и возвращать вашу настраиваемую связь не по умолчанию

вот и все. Я создал пакет, который уже делает это: https://github.com/fico7489/laravel-pivot