在我的控制器中,我的代码类似于以下内容:
$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
记录我该怎么做?
答案 0 :(得分:13)
这很简单,使用数据库事务:
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 database transactions
修改强>
如果您需要传递任何变量,则需要使用use
构造,如下所示:
DB::transaction(function () use ($variable1, $variable2) {
// ...
});