首页 > 解决方案 > 在 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);

但是订阅没有保存。任何想法保存它们的最佳做法是什么,检查它们是否被保存并建立关系?

标签: laraveleloquentlaravel-6eloquent-relationship

解决方案


您正在寻找的是交易。你可以用两种方法来做。

使用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();
}

有关交易的更多信息


推荐阅读