显示数据库插入操作的消息
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
返回 true
或 false
,因此检查保存的返回将让您知道操作是否成功。
您也可以使用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
【讨论】:
以上是关于显示数据库插入操作的消息的主要内容,如果未能解决你的问题,请参考以下文章