如何在Eloquent Laravel 5.5中使用事务(Transaction)

3

我尝试使用以下代码在Laravel 5.5中使用Eloquent进行事务处理:

DB:: transaction(function () {
$project = Project::find($id);
$project->users()->detach();
$project->delete();
});

我收到了以下错误:

方法 [transaction] 不存在。


DB::后面有一个空格。 - HelloSpeakman
@HelloSpeakman 这可能只是因为帖子格式问题。我们需要原帖作者澄清。 - Script47
可能是Laravel Eloquent ORM Transactions的重复问题。 - Script47
@HelloSpeakman 谢谢你的回答。我已经修复了。 - Tiến Nguyễn Văn
2个回答

28

您可以尝试这种方法,

        DB::beginTransaction();
        try {
            $project = Project::find($id);
            $project->users()->detach();
            $project->delete();
            DB::commit();
        } catch (\Exception $ex) {
            DB::rollback();
            return response()->json(['error' => $ex->getMessage()], 500);
        }

谢谢伙计,正好是我所需的。 - Arnaud Bouchot

3

这是一段有点长的代码块,但足以展示我在这个数据库事务中做了很多事情的好例子。

DB::transaction(function () use ($request) {
        $digitalLibrary =   new DigitalLibrary();

        $digitalLibrary->exhibitor_id               =   $request["exhibitor-id"];
        $digitalLibrary->event_id                   =   $request["event-id"];

        $digitalLibrary->save();
        
        $digitalLibraryIdForFiles                   =   $digitalLibrary->id;
        $digitalLibraryExhibitorIdForFiles          =   $digitalLibrary->exhibitor_id;
        $exhibitorIdForRedirect                     =   $digitalLibraryExhibitorIdForFiles;

        //Repeater
        $arrDocks                                   = $request["group-docs"];
        
        for($count=0; $count < count($arrDocks); $count++){                
            
            //Document Upload
            $parentFolderName                   =   "DIGITAL_LIBRARY";
            $fileNameToStore                    =   "no-logo.tmp";

            $clientNameFolder                   =   "";
            $exhibitorName                      =   Exhibitor::find($digitalLibrary->exhibitor_id)->exhibitor_name;
            
            if (Str::contains($exhibitorName," ")){
                $clientName = explode(" ", $exhibitorName);    
                if(count($exhibitorName) > 1){
                    $fileName = $exhibitorName[0] . '_' . $exhibitorName[1];
                }
            }
            else{
                $fileName = $exhibitorName;
            }

            if($arrDocks[$count]["upload-document"])
            {
                $logoFileNameWithExtension = $arrDocks[$count]["upload-document"]->getClientOriginalName();            
                $exhibitorNameFolder = $fileName;
                $fileExtension=$arrDocks[$count]["upload-document"]->getClientOriginalExtension();
                $docFileNameToStore = $fileName.'_'.time().'_.'.$fileExtension;
                $path = $arrDocks[$count]["upload-document"]->storeAs('public/DOCUMENTS/'.$parentFolderName.'/'.$exhibitorNameFolder.'/files', $docFileNameToStore);
            }

            //Document Upload End
            $files                              =   new DigitalLibraryFiles();
            $files->digital_library_id          =   $digitalLibraryIdForFiles;
            $files->exhibitor_id                =   $digitalLibraryExhibitorIdForFiles;
            
            $files->file_type_id                =   $arrDocks[$count]["document-type-select"];
            $files->file_name                   =   $docFileNameToStore;
            
            $files->save();
        }
        //Repeater End


        //Image Multi-upload
        $fileNameToStore="no-image.jpg";

        if(request('gallery-image'))
        {
            $i=0;
            foreach($request->file('gallery-image') as $thisImage){
                $fileNameWithExtension          = $thisImage->getClientOriginalName();
                $memberName                     = Exhibitor::find($digitalLibrary->exhibitor_id)->exhibitor_name;;
                $memberNameFolder               = "";
                
                if (Str::contains($memberName," ")){
                    $memberName = explode(" ", $memberName);    
                    if(count($memberName) > 1){
                        $fileName = $memberName[0] . '_' . $memberName[1];
                    }
                }
                else{
                    $fileName = $memberName;
                }
                $memberNameFolder = $fileName;

                $extension=$thisImage->getClientOriginalExtension();
                
                $fileNameToStore = $fileName.'_'.time().$i.'.'.$extension;

                $path= $thisImage->storeAs('public/images/DIGITAL_LIBRARY/'.$memberNameFolder.'/digital-lib-images',$fileNameToStore);


                $libImages                              =   new DigitalLibraryImage();
                $libImages->digital_library_id          =   $digitalLibraryIdForFiles;
                $libImages->exhibitor_id                =   $digitalLibraryExhibitorIdForFiles;
                $libImages->event_id                    =   '';
                $libImages->client_id                   =   '';
                $libImages->is_active                   =   1;
                $libImages->file_name                   =   $fileNameToStore;

                $libImages->save();
                $i++;
            }
        }
    });

**即使事务回滚,文件上传仍将发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接