【问题标题】:How can I use db transaction in laravel?如何在 laravel 中使用 db 事务?
【发布时间】:2017-07-21 07:39:10
【问题描述】:

我试试这个:

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();,它可以工作/成功删除。

如果删除产品失败,删除类别也失败了怎么办?

【问题讨论】:

    标签: php laravel transactions laravel-5.3


    【解决方案1】:

    您不能在 transaction 中添加 return 语句来停止整个进程并执行 DB::rollback()

    要切换return,你可以定义一个boolean变量,并在你catch异常时使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
        }
    }
    

    希望你能理解。

    【讨论】:

    • 但是为什么呢?如果没有捕获到异常,则$sucess 将具有值true,这意味着事务中没有错误,因此应该执行删除操作
    • @TrendingNews 恭喜
    【解决方案2】:

    你可以这样使用它:

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

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      相关资源
      最近更新 更多