【问题标题】:Laravel Eloquent Catch Special ExpectionLaravel Eloquent 捕获特定异常
【发布时间】:2017-03-22 09:43:51
【问题描述】:

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

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

【问题讨论】:

标签: php twitter-bootstrap laravel exception eloquent


【解决方案1】:

您必须将您的数据库操作包装到 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

【讨论】:

  • 首先感谢您的回答。但似乎有些问题,我只是尝试在错误代码 1062 的捕获中 echo "test",但没有回显 test,而是我仍然收到 laravel 错误。另外,我想知道我(如果有 errorCode 1062)如何返回仍然输入值的页面并显示这已经存在的消息
  • 1062 错误代码是针对 mysql 的?你用的是mysql吗?你会尝试重定向而不是 echo "test" 吗?
  • 我正在使用 eloquent,所以它是一个 mysql 数据库,但我没有直接使用它,但错误消息也显示 1062。但是对我的答案的评论看起来也很好很容易,我直接回到表格等。
  • 用 Laravel 验证器示例更新了答案。
猜你喜欢
  • 1970-01-01
  • 2015-10-18
  • 2012-11-11
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多