Reputation: 33
I tried the following code to use Transaction with Eloquent in Laravel 5.5:
DB:: transaction(function () {
$project = Project::find($id);
$project->users()->detach();
$project->delete();
});
I recevied the errors:
Method [transaction] does not exist.
Upvotes: 3
Views: 13656
Reputation: 1722
This is a bit long block of code but a good enough example to show how I do quite a few things here, in this DB transaction.
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++;
}
}
});
**The file uploads will still happen even if the Transaction rollback though.
Upvotes: 3
Reputation: 1966
You can try this way,
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);
}
Upvotes: 28