Downloads
Stars
Version
Read this in other languages: English, 日本語.
Controlling events that occur in a transaction.
composer require technote/laravel-transaction-fire-event
In the model where you want to control the firing of events, use DelayFireEvent
trait.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Technote\TransactionFireEvent\Models\DelayFireEvent;
class Item extends Model
{
use DelayFireEvent;
public static function boot()
{
parent::boot();
self::saved(function ($model) {
//
});
}
// relation example
public function tags(): BelongsToMany
{
return $this->belongsToMany(Tag::class);
}
}
If used within a transaction, saved
and deleted
events will be held until the end of the transaction.
DB::transaction(function () {
$item = new Item();
$item->name = 'test';
$item->save();
// The `saved` event will not be fired here yet.
$item->tags()->sync([1, 2, 3]);
}
// The `saved` event is called at the end of the transaction,
// so you can get the synchronized tags with `$model->tags()->sync`.
The target events are saved
and deleted
by default.
To change it, override getDelayTargetEvents
.
protected function getDelayTargetEvents(): array
{
return [
'created',
'updated',
'saved',
'deleted',
];
}