Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Laravel 6中同时保存两个相互关联的新模型_Laravel_Eloquent_Laravel 6_Eloquent Relationship - Fatal编程技术网

在Laravel 6中同时保存两个相互关联的新模型

在Laravel 6中同时保存两个相互关联的新模型,laravel,eloquent,laravel-6,eloquent-relationship,Laravel,Eloquent,Laravel 6,Eloquent Relationship,我想知道什么是同时保存两个相互关联的不同模型的最佳方法。考虑到我有一个订阅模型和一个参与者模型,当我创建一个参与者时,它必须创建一个订阅并将参与者链接到它。 例如: 类订阅扩展了模型 { 公共活动参与者() { 返回$this->hasMany('App\Participant'); } } 类参与者扩展模型 { 公共功能订阅() { 返回$this->belongsTo('App\Subscription'); } } 保存: $s=newapp\Subscription(); $p=

我想知道什么是同时保存两个相互关联的不同模型的最佳方法。考虑到我有一个订阅模型和一个参与者模型,当我创建一个参与者时,它必须创建一个订阅并将参与者链接到它。 例如:

类订阅扩展了模型
{
公共活动参与者()
{
返回$this->hasMany('App\Participant');
}
}

类参与者扩展模型
{
公共功能订阅()
{
返回$this->belongsTo('App\Subscription');
}
}

保存:

$s=newapp\Subscription();
$p=新应用程序\参与者();
$s->participants()->保存($p);

但是订阅没有保存。有什么好办法可以同时保存它们,检查它们是否已保存并建立关系吗?

您正在寻找的是事务。你可以用两种方法

使用
DB::transaction()
并将所有内容都放在一个闭包中

使用DB;
$s=新应用程序\订阅();
$p=新应用程序\参与者();
DB::事务(函数()使用($s,$p){
//如果某项操作失败,它将回滚,如果失败,它将提交。
$s->save();
$s->participants()->保存($p);
});
或者手动控制提交或回滚的时间

使用DB;
$s=新应用程序\订阅();
$p=新应用程序\参与者();
试一试{
DB::beginTransaction();
$s->save();
$s->participants()->保存($p);
DB::commit();
}捕获(\异常$e){
DB::rollBack();
}

您可以通过事务实现这一点(如@IGP的回答),或者也可以添加订阅的保存行

public function test()
{
    // Begin Transaction
    DB::beginTransaction();

    try
    {
        $participant = new Participant();

        $subscription = new Subscription();
        // $subscription->name = "parent subscription"; // init necessary columns
        $subscription->save();

        $participant->subscription()->associate($subscription);
        // $participant->name = "child participant"; // init necessary columns
        $participant->save();

        // Commit Transaction
        DB::commit();

        // Continue your logic here

    } catch (\Exception $e) {
        // Rollback Transaction
        DB::rollback();

        return $e->getMessage();
    }
}

你为什么要“同时”救他们?您不能执行
$s->保存$s->participants()->save($p)?是的,我能!但是,当转到下一行时,保存功能是否始终完成?当参与者的保存失败时,我会如何处理订阅模式?啊,我明白你的意思。我会发布一个回复!我不知道这个存在。使用手动方法,我可以显示一个错误。非常感谢你!