Откат транзакции для нескольких и подключенных Eloquent - PullRequest
0 голосов
/ 17 октября 2019

, поэтому у меня возникла проблема, так как в моей функции хранилища на моем контроллере я делаю 2 (или более) создания, а второе создание зависит от первого идентификатора создания, и когда мое второе создание не удалось, оно выдаст исключение, но первое создание ужебыло сделано, и поскольку мое первое создание имеет уникальные правила проверки, при следующем нажатии пользователем кнопки «Сохранить» на передней панели будет отображаться ошибка из-за дублирования записи.

это выглядит так в моем контроллере

public function store(Request $request)
{
    try{
        $this->validate($request,Seller::$rules);

        $name = $request->name;

        if(!empty($request->gambar))
            $fileName = Helper::image_processing($this->imagepath,$this->width,$this->height,$request,'');
        else
            $fileName = ''; 

        // my first create
        $class = Seller::create($request->except('gambar') + [
            'gambar' => $fileName
        ]);

        // my second create that depends on first create id
        $this->syncProduct($request, $class->id);

        return response()
            ->json([
                'saved' => true,
                'message' => $this->message. ' ' .$name. ' already been added',
                'id' => $class->id
            ]); 
    } catch (\Exception $e){
        $errorCode = $e->errorInfo[1];
        if($errorCode == 1062){
            abort(500, 'Duplicate seller id');
        }else{
            abort(500, $e->getMessage());
        }
    }
}

У меня вопрос, как получить какие-то функции отката, которые, если что-то пойдет не так, будут возвращаться во времени, прежде чем какие-либо данные будут созданы / обновлены?

1 Ответ

1 голос
/ 17 октября 2019

Вы можете использовать \DB::beginTransaction() для начала транзакции. Чтобы зафиксировать \DB::commit();, и если вы получите какую-либо ошибку из catch, вы можете выполнить откат следующим образом: \DB::rollBack();.

// Begin Transaction
\DB::beginTransaction(); 
    try {
       //your code.
       // Commit Transaction
        \DB::commit();

    } catch (\Illuminate\Database\QueryException $ex) {
        $msg = $ex->getMessage();
        if (isset($ex->errorInfo[2])) :
            $msg = $ex->errorInfo[2];
        endif;
        // Rollback Transaction
        \DB::rollBack();
        $arr = array("status" => 400, "msg" =>$msg, "result" => array());
    } catch (Exception $ex) {
        $msg = $ex->getMessage();
        if (isset($ex->errorInfo[2])) :
            $msg = $ex->errorInfo[2];
        endif;
        // Rollback Transaction
        \DB::rollBack();
        $arr = array("status" => 400, "msg" =>$msg, "result" => array());

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