显示数据库插入操作的消息

Posted

技术标签:

【中文标题】显示数据库插入操作的消息【英文标题】: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');
    

【问题讨论】:

【参考方案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

【讨论】:

以上是关于显示数据库插入操作的消息的主要内容,如果未能解决你的问题,请参考以下文章

在索引视图页面中显示插入和更新数据的消息

在数据库中插入值后显示成功消息

在Mysql数据库中插入动态选择框值并显示数据提交消息

我想在成功将数据插入数据库后为客户端显示消息..那么如何在javascript中使用alert()消息来实现这一点?

事务中发送消息产生的问题

SonarQube