Laravel 5后面的记录添加失败如何回滚新记录?
How to rollback new records if a later record fails to add in Laravel 5?
在我的控制器中,我有类似于以下的代码:
$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 database transactions
编辑
如果你需要传递任何变量,你需要像这样使用use
构造:
DB::transaction(function () use ($variable1, $variable2) {
// ...
});
在我的控制器中,我有类似于以下的代码:
$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 database transactions
编辑
如果你需要传递任何变量,你需要像这样使用use
构造:
DB::transaction(function () use ($variable1, $variable2) {
// ...
});