Laravel Eloquent Catch Special Expection

时间:2016-11-08 16:57:28

标签: php twitter-bootstrap laravel exception eloquent

我目前正在尝试以下操作:在我的数据库中,我有一个名为templateURL的列,它是一个唯一键,因此它只能存在一次。然后,如果某些东西试图提交一个表单,这与已经存在的表单相同,则会抛出错误,说 Integrity constraint violation: 1062 Duplicate entry for key 'templateURL'

当然它确实如此,这就是我使这个专栏独一无二的原因。但是:我想要的不是默认的Laravel错误,而是返回到仍然输入值的表单和一条消息(例如来自bootstrap的警报或只是输入字段旁边的div),说这已经存在并要求选择另一个。因此,我需要捕获此异常并执行自定义操作。我怎样才能实现我的目标?

1 个答案:

答案 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

验证的详情