Транзакция в красноречивом запросе laravel с несколькими запросами на вставку - PullRequest
0 голосов
/ 04 июля 2019

Я хочу знать, как использовать запрос транзакции для отката, если мои запросы содержат ошибки, и зафиксировать, если нет. У меня есть запросы, которые используют foreach причина наличия нескольких данных. вот что я пытаюсь.

DB::transaction(function(){
                $receiving = New Table1;
                $receiving->created_on = \Carbon\Carbon::now();
                $receiving->created_by = Auth::user()->id;
                $receiving->received_on = \Carbon\Carbon::parse($request->DateAcquired);
                $receiving->received_by = Auth::user()->id;
                $receiving->checked_on = \Carbon\Carbon::now();
                $receiving->checked_by = Auth::user()->id;
                $receiving->remark = $request->Remarks;
                $receiving->save();

                foreach ($request->data as $data)
                {
                    $asset = New Table2;
                    $asset->category = $data[0];
                    /*$asset->asset_number = $data[1];*/
                    $asset->name = $data[2];
                    $asset->brand = $data[3];
                    $asset->model = $data[4];
                    $asset->ownership_type = $data[5];
                    $asset->serial_number = $data[6];
                    $asset->mac_address = $data[7];
                    $asset->cpu = $data[8];
                    $asset->memory = $data[9];
                    $asset->hard_disk = $data[10];
                    $asset->os = $data[11];
                    $asset->remark = $data[12];
                    $asset->description = $data[13];
                    $asset->date_acquired = \Carbon\Carbon::parse($request->DateAcquired);
                    $asset->receiving_id = $receiving->id;
                    $asset->save();
                }
            });

Я также пытался использовать DB::beginTransaction();

но я получаю ошибку

неопределенная функция beginTransaction () в построителе запросов.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Как упоминалось в Транзакции с базой данных Laravel :

Вы можете использовать метод транзакции на фасаде БД для запуска набора операций внутри транзакции базы данных.Если в закрытии транзакции возникает исключение, транзакция автоматически откатывается.Если Закрытие выполняется успешно, транзакция будет автоматически зафиксирована.Вам не нужно беспокоиться о ручном откате или фиксации при использовании метода транзакции:

, но, как я вижу в вашем коде, вы используете переменную $request в функции обратного вызова transaction, поэтому на этом этапе вы должны передать $request в функцию обратного вызова, чтобы использовать ее.

ваш код будет выглядеть так:

DB::transaction(function() use ($request) {

               // put your code here  

 });
0 голосов
/ 05 июля 2019

Возможно, вам потребуется передать переменную в транзакцию через use()

  DB::transaction(function() use ($request) {
                    $receiving = New Table1;
                    $receiving->created_on = \Carbon\Carbon::now();
                    $receiving->created_by = Auth::user()->id;
                    $receiving->received_on = \Carbon\Carbon::parse($request->DateAcquired);
                    $receiving->received_by = Auth::user()->id;
                    $receiving->checked_on = \Carbon\Carbon::now();
                    $receiving->checked_by = Auth::user()->id;
                    $receiving->remark = $request->Remarks;
                    $receiving->save();

                    foreach ($request->data as $data)
                    {
                        $asset = New Table2;
                        $asset->category = $data[0];
                        /*$asset->asset_number = $data[1];*/
                        $asset->name = $data[2];
                        $asset->brand = $data[3];
                        $asset->model = $data[4];
                        $asset->ownership_type = $data[5];
                        $asset->serial_number = $data[6];
                        $asset->mac_address = $data[7];
                        $asset->cpu = $data[8];
                        $asset->memory = $data[9];
                        $asset->hard_disk = $data[10];
                        $asset->os = $data[11];
                        $asset->remark = $data[12];
                        $asset->description = $data[13];
                        $asset->date_acquired = \Carbon\Carbon::parse($request->DateAcquired);
                        $asset->receiving_id = $receiving->id;
                        $asset->save();
                    }
                });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...