Как я могу использовать транзакцию db в laravel?

Я пробую это:

public function destroy($id) { DB::beginTransaction(); try { $product = $this->product_repository->find($id); $result = $product->categories()->detach(); if($result) { list($status,$instance) = $this->product_repository->delete($id); } DB::commit(); return ['status'=>true,'data'=>$status]; } catch (\Exception $e) { DB::rollback(); return ['status'=>false, 'message'=>$e->getMessage()]; } } 

Если код выполнен, $this->product_repository->delete($id) не работает / не удаляется.

Но это: $product->categories()->detach(); , он работает / удаляется.

Как, если удалить продукт не удалось, удалить категорию также не удалось?

Вы не можете добавить оператор return внутри transaction который останавливает весь процесс и выполняется DB::rollback() .

Чтобы переключить return , вы можете определить boolean переменную и сделать false во время исключения исключения.

Как это:

 public function destroy($id) { $success = true; DB::beginTransaction(); try{ // Your Code $product = $this->product_repository->find($id); $result = $product->categories()->detach(); if($result) { list($status,$instance) = $this->product_repository->delete($id); } DB::commit(); }catch(\Exception $e){ DB::rollback(); $success = false; } if($success){ // Return data for successful delete } else{ // Return data for unsuccessful delete } } 

Надеюсь ты понимаешь.

Вы можете использовать его следующим образом:

 $returnResult = []; DB::beginTransaction(); try { ... DB::commit(); $returnResult['status'] = true; $returnResult['data'] = $status; } catch (...) { ... DB::rollback(); $returnResult['status'] = true; $returnResult['message'] = $e->getMessage(); } return $returnResult;