Laravel: запись может быть создана и коллекция возвращена, но не сохраняется в базе данных - PullRequest
0 голосов
/ 31 января 2020

Я использую Laravel Framework 5.6.39, и я получаю эту проблему при попытке сохранить в моей базе данных PostgreSQL 12.1. Я изо всех сил стараюсь объяснить мою проблему, но я создал пример того, что происходит ниже.

У меня есть 2 таблицы, назовем их Foo и Bar, и их Модели можно называть одинаковыми. Внутри моего контроллера Foo у меня есть функция, которая принимает запрос и обновляет запись Foo. У меня есть настройка Observer для Foo, которая должна создавать новую запись в таблице Bar при обновлении foo. Эта проблема, с которой я сталкиваюсь, заключается в том, что создается новая запись для Bar, поскольку я могу вернуть коллекцию для этой записи, а также использовать некоторые функции отношений, которые я настроил для Bar, но она не создается в моем Postgres база данных. Ошибки не возвращаются. Я столкнулся с такой проблемой раньше, как показано в коде ниже, но мне удалось решить, вызвав DB::commit. Я пытался сделать такой же вызов в моем Foo Observer, но, похоже, ничего не работает :( ...

Если кто-нибудь может просмотреть созданный ниже пример и помочь мне решить его, я был бы очень признателен!

Спасибо.

Внутри моего контроллера у меня есть следующая функция: Foo Controller:

public function fooMethod(Request $request) {
    try {
        // Start transaction
        \DB::beginTransaction();

        // ** only showing this part since I needed this to fix a similar issue
        // but Now this doesn't work in my new scenario
        // ...
        // If it does't exisit call another function to create it.
        if(!request->id) {
            $newFoo = $this->anotherFooMethod();
            // Needed to add this DB::commit to fix a similar t
            \DB::commit();
            // Send back new created file
            return  $this->sendResponse($newFoo);
        }else {
            // Foo exisit update the record.
            $foo = Foo::find($request->id);
            $foo->item = true;
            $foo->save(); // this update triggers my FooObserver which listens for update
        }

        // commit transaction
        \DB::commit();
    }catch(\Throwable  $exc) {
        // If error processing rollback
        \DB::rollBack();
        return  $this->sendResponse(null, false);
    }
}

Это пример моего класса FooObserver:

public  function  updated(Foo  $foo) {
    // must be logged in to perform action
    if(!auth()) {
        return;
    }
    $bar = new Bar();
    $bar->barColumn = true;
    // Store FK from foo 
    $bar->foo_id = $foo->id;
    $bar->save(); // here is my issue ...
    // Right here I am able to access the new record of $bar and even use the 
    // Model relationship I have setup for Bar
    // But the record does not exisit in my Postgres database.

    // I have tried using the DB::commit here and re-calling it in my Foo Controller but still nothing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...