我想使用Eloquent创建一个这样的数据库条目:
MFUser::create(array(
'user_reference' => $this->userReference,
'first_name' => $this->firstName,
'last_name' => $this->lastName,
'user_type_id' => $this->userTypeId,
'email' => $this->email,
'password' => $this->password
));
除了这种情况之外,它的效果很好,当完全相同的数据放入字段时,这是预期的,因为应该没有重复。然后我得到QueryExecption。
但是如何在此处正确执行错误处理以检查是否发生此查询异常,以便我可以通过json将响应从我的服务器返回给客户端呢?
答案 0 :(得分:3)
将该代码包装在try
- catch
块中。像这样:
try {
MFUser::create(array(
'user_reference' => $this->userReference,
'first_name' => $this->firstName,
'last_name' => $this->lastName,
'user_type_id' => $this->userTypeId,
'email' => $this->email,
'password' => $this->password
));
} catch (\Illuminate\Database\QueryException $exception) {
// You can check get the details of the error using `errorInfo`:
$errorInfo = $exception->errorInfo;
// Return the response to the client..
}
答案 1 :(得分:3)
我更愿意保留try/catch
以查找无法在其他地方处理的意外事件。在这种情况下,您可以将验证用作第一个度量,将异常处理程序用作备份度量。
如果表单请求失败,则会闪烁错误消息,并且用户将返回上一页(提交表单的位置),您可以正常处理消息。 Validation requests
// First line of defence - gracefully handle
// Controller
public function store(MFUserRequest $request)
{
// The incoming request is valid...
MFUser::create(array(...));
}
// Form Request
class MFUserRequest extends Request
{
public function rules()
{
return [
'email' => 'required|email|unique:users,email',
];
}
}
在其他地方,在您的App \ Exceptions目录中,您有一个异常处理程序类,可以捕获所有错误。如果您无法优雅地进一步处理它,请使用此功能。
// Second line of defence - something was missed, and a model was
// created without going via the above form request
namespace App\Exceptions;
class Handler extends ExceptionHandler
{
public function render($request, Exception $e)
{
if($e instanceof QueryException) {
// log it or similar. then dump them back on the dashboard or general something bad
// has happened screen
return redirect()->route('/dashboard');
}
}
}
答案 2 :(得分:1)
Try and Catch
可能会对您有所帮助,并为所有对象设想创建try try,但是有处理所有QueryException的最佳实践,我建议您使用Laravel Exceptions Handler,因为它使u易于全局执行!
尝试一下!,打开App\Exception\Handler.php
,然后在渲染方法中,您可以像这样写
public function render($request, Throwable $exception)
{
if ($request->ajax() || $request->wantsJson()) {
if ($exception instanceof QueryException) {
// example algo for make response
return response()->json(['message' => 'xxx'], 403);
}
}
return parent::render($request, $exception);
}
之后,对于查询触发的每个错误请求,您都可以获取xxx json
答案 3 :(得分:0)
只需使用try / catch
块即可。
use Illuminate\Database\QueryException;
// ...
try {
// DB query goes here.
} catch (QueryException $e) {
// Logics in case there are QueryException goes here
}
// ...