在我的控制器中,我有类似于以下代码:
$a = new A(); $a->content = "blah"; $a->save(); $b = new B(); $b->content = "blah2"; $b->a_id = $a->id; $b->save(); $c = new C(); $c->content = "blah3"; $c->b_id = $b->id;
在那里A
,B
并且C
是所有车型.
如您所见,每个模型分配都依赖于先前正确分配的记录(即C
依赖B
并B
依赖C
)
我想制作代码,以便如果其中一个新记录失败,它会删除所有以前的记录(即全部或全部).
例如,
如果A
保存失败,代码将正常结束
如果B
无法保存,则会删除其相应的A
记录
如果C
无法保存,它删除其相应的B
和A
记录
我该怎么做呢?
这很简单,使用数据库事务:
DB::transaction(function () { $a = new A(); $a->content = "blah"; $a->save(); $b = new B(); $b->content = "blah2"; $b->a_id = $a->id; $b->save(); $c = new C(); $c->content = "blah3"; $c->b_id = $b->id; });
这里的所有内容都将自动完成 - 如果上述任何一项失败,结果将与从未运行过的内部代码相同.
参考:Laravel数据库事务
编辑
如果需要传递任何变量,则需要使用如下use
构造:
DB::transaction(function () use ($variable1, $variable2) { // ... });
参考:匿名函数