我目前正在尝试以下操作:在我的数据库中,我有一个名为templateURL
的列,它是一个唯一键,因此它只能存在一次。然后,如果某些东西试图提交一个表单,这与已经存在的表单相同,则会抛出错误,说
Integrity constraint violation: 1062 Duplicate entry for key 'templateURL'
。
当然它确实如此,这就是我使这个专栏独一无二的原因。但是:我想要的不是默认的Laravel错误,而是返回到仍然输入值的表单和一条消息(例如来自bootstrap的警报或只是输入字段旁边的div),说这已经存在并要求选择另一个。因此,我需要捕获此异常并执行自定义操作。我怎样才能实现我的目标?
答案 0 :(得分:2)
您必须将数据库操作包装到try-catch
块中并捕获错误并在收到错误时执行其他操作,可能会使用带有错误消息的旧输入数据重定向。
duplicate entry的错误代码 1062 。因此,如果您将1062作为错误代码,则表示此数据是重复条目。以下是捕获此异常的代码。
try {
$data = Model::create(array(
'templateURL' => 'some value ',
));
} catch (Illuminate\Database\QueryException $e) {
$errorCode = $e->errorInfo[1];
if($errorCode == 1062){
// we have a duplicate entry problem
}
}
或者如果您不想自己处理异常,可以使用Laravel Validator。喜欢跟随您的控制器
// validation rules
$rules = array(
'templateURL' => 'unique:YourTableNameHere'
);
$validator = Validator::make(Input::all(), $rules);
// check if the validation failed
if ($validator->fails()) {
// get the error messages from the validator
$messages = $validator->messages();
// redirect user back to the form with the errors from the validator
return Redirect::to('form')
->withErrors($validator);
} else {
// validation successful
$data = Model::create(array(
'templateURL' => 'some value ',
));
}
然后在您的视图模板中,您可以通过$errors
变量访问错误消息。
了解有关https://laravel.com/docs/5.3/validation