【问题标题】:display message for database insert operation显示数据库插入操作的消息
【发布时间】:2018-12-20 09:38:42
【问题描述】:

有没有什么机制可以知道app发送的数据是否成功插入数据库,如stored procedure,我们使用output parameter

我们如何确保数据插入到数据库中,如果数据插入操作失败,如何捕捉错误原因并以用户友好的方式显示?

// controller code
public function store(Request $request)
    {           
        $validatedInput = $request -> validate([
            'NBookName' => 'required|string|min:3|max:100',
            'NBookId' => 'required|string|min:2|max:10|unique:books,BookID',  // unique:table_name,column_name
            'NBookUnitPrice' => 'required|max:5|'
        ]);

        $book = new Book;
        $book -> BookName = $request->input('NBookName');
        $book -> BookID = $request->input('NBookId');
        $book -> BookUnitPrice = $request->input('NBookUnitPrice');
        $book->save();

        return view('pages.about');
    }

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

    Eloquent 方法 save 返回 truefalse,因此检查保存的返回将让您知道操作是否成功。

    您也可以使用saveOrFail 方法,该方法也将返回true / false,但也可以给出Throwable

    来自文档:https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Model.html#method_save

    示例:

    if( $book->save() ){
        return response()->json($book, 200);
    } else {
        return response()->json(['error' => 'Could not save'], 400);
    }
    

    try {
        $book->saveOrFail();
        return response()->json($book, 200);
    } catch( \Exception $e ){
        return response()->json(['error' => $e->getMessage()], 400);
    }
    

    【讨论】:

      【解决方案2】:

      save() 将返回一个布尔值,已保存或未保存。所以你可以做喜欢:

      $saved = $book->save();
      if(!$saved)
      {
          App::abort(500, 'Error');//Or return any message to view
      }
      

      更多详情:check-if-laravel-model-got-saved-or-query-got-executed

      【讨论】:

        【解决方案3】:

        我会从分离层开始,我不喜欢在同一个地方观看验证、Eloquent 查询和查看相关输出。

        在阅读下面的答案之前,先看看

        https://laravel.com/docs/5.6/validation#form-request-validation

        我会制作中间件来对用户进行身份验证和授权,然后使用 formrequests 来验证输入数据,当它到达控制器时,用户已经过身份验证、授权、数据验证,所需要的只是调用某人负责插入操作并向UI返回一些东西。

        "我们如何确保数据被插入到数据库和 数据插入操作失败的情况"

        一般来说,try catch 就可以了:

        public function store(Request $request)
            {            
                try {
                    $validatedInput = $request -> validate([
                        'NBookName' => 'required|string|min:3|max:100',
                        'NBookId' => 'required|string|min:2|max:10|unique:books,BookID',  // unique:table_name,column_name
                        'NBookUnitPrice' => 'required|max:5|'
                    ]);
        
                    $book = new Book;
                    $book -> BookName = $request->input('NBookName');
                    $book -> BookID = $request->input('NBookId');
                    $book -> BookUnitPrice = $request->input('NBookUnitPrice');
                    $book->save();
                } catch (\Exception $e) { 
                 // return your pretty response
                 // If the operation saving to the database fails, you'll get the information here on whatever it is about, 
                 // as the generic exception catchs it. It should catch the stored procedure output aswell
                }
                return view('pages.about');
            }
        

        如果您计划进行一系列插入和更新/删除,并且不希望它们破坏逻辑(插入一些并在 1 错误时停止插入),您可以use DB; 并使用DB::beginTransaction()DB::commit()DB::rollback() 在您的代码上

        https://laravel.com/docs/5.6/database

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-01
          • 2020-12-01
          • 2017-12-25
          • 1970-01-01
          • 2013-03-22
          • 2011-12-25
          • 1970-01-01
          • 2018-05-02
          相关资源
          最近更新 更多