Laravel вставляет родительский дочерний элемент не удается внутри транзакции - PullRequest
2 голосов
/ 24 сентября 2019

Я пытаюсь выполнить 2 вставки, в таблице 2 таблицы ограничены с помощью внешнего ключа.Эти 2 операции должны выполняться внутри транзакции, чтобы предотвратить возможные сбои.

Драйвер базы данных - pgsql.

SomeRepo.php (пробовал с вариантом закрытия транзакцииа также)

        DB::beginTransaction();
        try {
            $parentData = [
                'name' => 'Parent name'
            ];
            $parent = new Parent($parentData);
            $parent->save();

            $childData = [
                'parent_id' => $parent->id,
                'name' => 'Child name'
            ];
            $child = new Child($childData);
            $parent->children()->save($child);
            DB::commit();
        } catch (Exception $e) {
            DB::rollback();
        }

Parent.php

    protected $fillable = [
        'name'
    ];

    public function children()
    {
        return $this->hasMany(Child::class);
    }

Child.php

    protected $fillable = [
        'name', 'parent_id'
    ];

Ошибка выполненияпри попытке вставить дочернюю строку с идентификатором родительского возврата.

insert or update on table "child" violates foreign key constraint "child_parent_id_foreign"

1 Ответ

0 голосов
/ 24 сентября 2019

дочерней функции нужна средняя таблица, замените ее на:

 public function children()
{
    return $this->belongsToMany(Child::class);
}

и не делайте этого $parent->children()->save($child);.

или, если вы хотите пойти по этому пути, сделайте child_parentтаблица, с 2 полями child_id и parent_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...