laravel - 在 Laravel 6 中一次保存两个相互关联的新模型
问题描述
我想知道同时保存两个相互关联的不同模型的最佳方法是什么。考虑我有一个订阅模型和一个参与者模型,当我创建一个参与者时,它必须创建一个订阅并将参与者链接到它。
例子:
class Subscription extends Model
{
public function participants()
{
return $this->hasMany('App\Participant');
}
}
class Participant extends Model
{
public function subscription()
{
return $this->belongsTo('App\Subscription');
}
}
保存:
$s = new App\Subscription();
$p = new App\Participant();
$s->participants()->save($p);
但是订阅没有保存。任何想法保存它们的最佳做法是什么,检查它们是否被保存并建立关系?
解决方案
您正在寻找的是交易。你可以用两种方法来做。
使用DB::transaction()
并把所有东西都放在一个闭包中
use DB;
$s = new App\Subscription();
$p = new App\Participant();
DB::transaction(function () use ($s, $p) {
// If something fails, it will rollBack, if not, it will commit.
$s->save();
$s->participants()->save($p);
});
或者手动,您可以控制何时提交或回滚。
use DB;
$s = new App\Subscription();
$p = new App\Participant();
try {
DB::beginTransaction();
$s->save();
$s->participants()->save($p);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
}
推荐阅读
- php - 如何使用 CURL 将原始数据转换为 php 中的 zip 文件?
- python - 在python中安装pytorch的问题 - ctypes.CDLL(dll) - OSError: [WinError 126] The specified module could not be found
- javascript - 我的代码是对的,但是eslint给我报错,怎么来的?
- python - 如何弹出一个图并等待响应
- javascript - 如何在这里解决 nodeJS 中的并发请求问题?
- c# - 绘制字符串时图形对象未使用正确的字体
- javascript - 为什么你不能增加价值?
- javascript - 打字稿声明地图类型
- vue.js - Firebase 邀请已弃用。使用 vue.js 和 firebase 设置用户邀请系统?
- linux - 在 Linux 上使用 actix-web + mongo 编译应用程序内存不足