Is there any event that is triggered in laravel after calling attach (or detach/sync)?php
-
1As far as I know there is no event called. However you could use the event handlers to fire one – cleanunicornMar 8 '15 at 18:50
-
Thanks! @hydrarulz yes but I will have to take care to fire it manually every time I use attach on that specific model, not optimal – Mihai Crăiță Mar 8 '15 at 20:27
No, there are no relation events in Eloquent. But you can easily do it yourself (Given for example Ticket belongsToMany Component
relation):laravel
// 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)); } }
event object as simple as this:app
<?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; } }
then a basic listener as a sensible example:ide
// 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()); });
and usage:post
$ php artisan tinker >>> $t = Ticket::find(1); => <App\Models\Ticket> >>> $t->syncComponents([1,3]); detached: 4 attached: 1,3 => null
Of course you could do it without creating Event objects, but this way is more convenient, flexible and simply better.flex