Laravel Eloquent 模型让你沉浸在以下时刻
retrieved、creating、created、updating、updated、saving、saved、deleting、deleted、restored、restored、@9876543332 @
以上事件因 laravel 版本而异。
Laravel 8.x
如果您使用的是 Laravel 8.x,那么 Laravel 会通过事务处理 eloquent 事件。
你只需要在你的观察者中使用public $afterCommit = true;。
然后 eloquent 事件将在提交事务后触发。
参考:https://laravel.com/docs/8.x/eloquent#observers-and-database-transactions
Laravel
使用以下版本的朋友,请看下面的代码。
您需要在app/Traits 文件夹中创建一个特征
在app/Traits/TransactionalEloquentEvents.php
<?php
namespace App\Traits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Events\TransactionCommitted;
use Illuminate\Support\Facades\Log;
trait TransactionalEloquentEvents
{
protected static $eloquentEvents = ['created', 'updated'];
protected static $queuedTransactionalEvents = [];
public static function bootTransactionalEloquentEvents()
{
$dispatcher = static::getEventDispatcher();
if (!$dispatcher) {
return;
}
foreach (self::$eloquentEvents as $event) {
static::registerModelEvent($event, function (Model $model) use ($event) {
/*get updated parameters*/
$updatedParams = array_diff($model->getOriginal(),$model->getAttributes());
if ($model->getConnection()->transactionLevel()) {
self::$queuedTransactionalEvents[$event][] = $model;
} else {
Log::info('Event fired without transaction '.$event. json_encode($updatedParams));
/* Do your operation here*/
}
});
}
$dispatcher->listen(TransactionCommitted::class, function (TransactionCommitted $event) {
if ($event->connection->transactionLevel() > 0) {
return;
}
foreach ((self::$queuedTransactionalEvents ?? []) as $eventName => $models) {
foreach ($models as $model) {
Log::info('Event fired with transaction '.$eventName);
/* Do your operation here*/
}
}
self::$queuedTransactionalEvents = [];
});
}
}
在你的模型中app/Models/Product.php
<?php
namespace App\Models;
use App\Traits\TransactionalEloquentEvents;
class Product extends Model
{
use TransactionalEloquentEvents;
}
注意:在updated eloquent 事件的情况下。您将通过$updatedParams 变量获取更新后的参数。
上述案例处理事务和非事务模型操作。
我在这里为每个活动维护一个日志。你也可以做你的手术。