模型的事件中如何确保代码块中关联的数据都写入后才执行Observers的方法呢?
我现在想保存订单数据
1.订单表
2.订单详情表
DB::beginTransaction();
try {
1.保存订单数据
2.保存订单数据
DB::commit();
}catch (\Exception $e){
DB::rollBack();
Log::error('下单失败', ['exception' => $e]);
}
我现在创建了订单的Observers
<?php
namespace App\Observers;
use App\Models\Order;
use Illuminate\Support\Facades\Log;
class OrderObserver
{
public $afterCommit = true;
public function saved($order){
Log::info("saved执行");
Log::info($order);
}
}
模型事件本质是一个event事件
只要是event事件 就会执行到这一步
如果先不考虑你是否使用了queue队列 就会执行到
handlerShouldBeDispatchedAfterDatabaseTransactions
这个方法这个方法里面有可以判断到
aftercommit
属性为true 就会执行到createCallbackForListenerRunningAfterCommits
这个方法里面就会执行到事务管理类的
addCallback
的方法 如果你当前在事务中就会等事务commit后就会被触发至于你的为什么不生效 可能是哪一步出问题了 或者你的版本是否支持
aftercommit