在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)代码>?是的,我能!但是,当转到下一行时,保存功能是否始终完成?当参与者的保存失败时,我会如何处理订阅模式?啊,我明白你的意思。我会发布一个回复!我不知道这个存在。使用手动方法,我可以显示一个错误。非常感谢你!