php - Laravel Eloquent 捕获特定异常

标签 php twitter-bootstrap laravel exception eloquent

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

当然可以,这就是为什么我让专栏独一无二。但是:我想要的不是默认的 Laravel 错误,而是返回到仍然输入值的表单和一条消息(例如来自 Bootstrap 的警报或输入字段旁边的一个 div)说这已经存在并要求选择另一个。所以我需要捕捉这个异常并做一些自定义的事情。我怎样才能达到我想要的?

最佳答案

您必须将数据库操作包装到 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。就像在你的 Controller 中跟随
// 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 ',
    ));
}

然后在您的 View 模板中,您可以通过 $errors 访问错误消息。多变的。
在此处了解有关验证的更多信息 https://laravel.com/docs/5.3/validation

关于php - Laravel Eloquent 捕获特定异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40492436/

相关文章:

html - 设置宽度后图像不会居中

html - 使用 Bootstrap 垂直对齐文本

mysql - 两个 Laravel 应用可以使用同一个数据库吗?

php - Google 喜欢使用 Levenshtein Distance 的 "Did you mean ?"搜索建议

PHP通知

javascript - PHP 需要输出 ' 而不是 '

html - 当可用空间发生变化时, flex 元素不会留在父级内部

php - 使用 Laravel 5.8 从动态表单更新数据

php - 将 php 数组填充到 HTML 表中

php - imap_fetchstructure() 不返回部件对象