Laravel插入父子在事务中失败

我正在尝试执行 2 次插入,在 2 个表中,表受外键约束。这两个操作必须在事务中执行以防止最终失败。(实际上我需要在更多表上执行更多插入,因此事务很重要;但此示例中的 2 个表足以复制问题)


数据库驱动是pgsql


SomeRepo.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"


小怪兽爱吃肉
浏览 162回答 3
3回答

Smart猫小萌

要将数据保存在相关表中,请使用此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.',    ],]);

倚天杖

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',    ],]);

烙印99

改变外键——在数据库上运行这个 sqlalter table child drop constraint child_parent_id;alter table child add foreign key (parent_id) references parent(id) deferrable initially deferred;这将允许您按任一顺序创建子级或父级,并且在提交之前不会验证约束。在这种情况下应该没有必要 - 但是,它确实取决于您的 ID 是如何生成的。
打开App,查看更多内容
随时随地看视频慕课网APP