为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel插入父子在事务中失败

Laravel插入父子在事务中失败

PHP
小怪兽爱吃肉 2022-01-24 13:05:40
我正在尝试执行 2 次插入,在 2 个表中,表受外键约束。这两个操作必须在事务中执行以防止最终失败。(实际上我需要在更多表上执行更多插入,因此事务很重要;但此示例中的 2 个表足以复制问题)数据库驱动是pgsqlSomeRepo.php(也尝试了事务关闭变体)        DB::beginTransaction();        try {            $parentData = [                'name' => 'Parent name'            ];            $parent = new Parent($parentData);            $parent->save();            $childData = [                // Tried it with and without setting "parent_id" here                'parent_id' => $parent->id,                'name' => 'Child name'            ];            $child = new Child($childData);            $parent->children()->save($child);            DB::commit();        } catch (Exception $e) {            DB::rollback();        }父.php    protected $fillable = [        'name'    ];    public function children()    {        return $this->hasMany(Child::class);    }儿童.php    protected $fillable = [        'name', 'parent_id'    ];尝试插入子行时执行失败,返回父 ID。insert or update on table "child" violates foreign key constraint "child_parent_id_foreign"
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

要将数据保存在相关表中,请使用此


Parent::create(['name'=>'parent name']); //save in parent table

$lastId = Parent::query()->max('id'); //get last inserted row id


$parent = App\Parent::find($lastId);


$child = $parent->children()->create([

    'message' => 'A new comment.',

]);

你也可以使用createMany方法


$parent = App\Parent::find($lastId);


$parent->children()->createMany([

    [

        'message' => 'A new comment.',

    ],

    [

        'message' => 'Another new comment.',

    ],

]);


查看完整回答
反对 回复 2022-01-24
?
倚天杖

TA贡献1828条经验 获得超3个赞

create通过使用和createMany在父模型的关系上尝试使用此代码:


// Create the parent object.

$parent = Parent::create([

  'name' => 'Parent 1'

]);


// Insert one.

$child = $parent->children()->create([

    'name' => 'Child 1',

]);


// Insert many.

$parent->children()->createMany([

    [

        'name' => 'Child 2',

    ],

    [

        'name' => 'Child 3',

    ],

]);


查看完整回答
反对 回复 2022-01-24
?
烙印99

TA贡献1829条经验 获得超13个赞

改变外键——在数据库上运行这个 sql


alter table child drop constraint child_parent_id;


alter table child add foreign key (parent_id) references parent(id) deferrable initially deferred;

这将允许您按任一顺序创建子级或父级,并且在提交之前不会验证约束。在这种情况下应该没有必要 - 但是,它确实取决于您的 ID 是如何生成的。


查看完整回答
反对 回复 2022-01-24
  • 3 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信