save(); $b = new B(); $b->conte-6ren">
gpt4 book ai didi

php - 如果以后的记录无法添加到 Laravel 5,如何回滚新记录?

转载 作者:可可西里 更新时间:2023-11-01 13:39:55 26 4
gpt4 key购买 nike

在我的 Controller 中,我有类似于以下的代码:

$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;

其中ABC都是模型。

如您所见,每个模型分配都依赖于正确分配的先前记录(即 C 依赖于 B,而 B 依赖于在 C)

我想编写代码,以便如果其中一条新记录失败,它会删除所有以前的记录(即全部或全部)。

例如,

  • 如果A保存失败,代码优雅结束
  • 如果B保存失败,则删除对应的A记录
  • 如果C保存失败,则移除其对应的BA记录

我该怎么做?

最佳答案

其实很简单,使用数据库事务:

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) {
// ...
});

引用:Anonymous functions

关于php - 如果以后的记录无法添加到 Laravel 5,如何回滚新记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34472065/

26 4 0
文章推荐: php - 验证失败后输入中的 Laravel 重置值?
文章推荐: html - 仅限 CSS - 带有滚动条的动态标题高度和 100% 内容高度
文章推荐: javascript - 根据文本输入的值添加