Php 拉雷维尔雄辩地捕捉到了特殊的期待

Php 拉雷维尔雄辩地捕捉到了特殊的期待,php,twitter-bootstrap,laravel,exception,eloquent,Php,Twitter Bootstrap,Laravel,Exception,Eloquent,我目前正在尝试以下操作:在我的数据库中,我有一个名为templateURL的列,它是一个唯一的键,因此它可能只存在一次。然后,如果某个东西试图提交一个表单,而该表单与已经存在的表单相同,则会抛出一个错误,即 完整性约束冲突:密钥“templateURL”的1062个重复条目 当然,这就是为什么我让这个专栏独一无二的原因。但是:我想要的不是默认的Laravel错误,而是返回表单时仍然输入值,并显示一条消息(例如,来自引导的警报或输入字段旁边的一个div),说明此错误已经存在,并要求选择另一个错误。

我目前正在尝试以下操作:在我的数据库中,我有一个名为
templateURL
的列,它是一个唯一的键,因此它可能只存在一次。然后,如果某个东西试图提交一个表单,而该表单与已经存在的表单相同,则会抛出一个错误,即
完整性约束冲突:密钥“templateURL”的1062个重复条目


当然,这就是为什么我让这个专栏独一无二的原因。但是:我想要的不是默认的Laravel错误,而是返回表单时仍然输入值,并显示一条消息(例如,来自引导的警报或输入字段旁边的一个div),说明此错误已经存在,并要求选择另一个错误。因此,我需要捕获此异常并执行一些自定义操作。如何实现我的目标?

您必须将数据库操作包装到
try catch
块中,捕获错误并在出现错误时执行其他操作,可能会使用带有错误消息的旧输入数据重定向

的错误代码为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
变量访问错误消息。
了解有关验证的更多信息

首先感谢您的回答。但似乎有点不对劲,我只是试图在错误代码1062的捕获中
回显“test”
,但没有
回显测试,相反,我仍然得到了laravel错误。另外,我想知道我(如果有错误代码1062)如何返回到仍然输入值的页面,并显示这已经存在的消息162错误代码是针对mysql的?你在使用mysql吗?你会尝试重定向而不是echo“test”吗?我使用的是eloquent,所以它是一个mysql数据库,但我不会直接使用它,但错误消息显示也是1062。但是我的答案的注释看起来很好,也很简单,我直接返回表单等。使用Laravel Validator示例更新了答案。阅读此@shoieb0101你是说
$rules
?看起来不错,但是我可以把它放在我的控制器中吗?我必须像他那样放在我的路线中吗?你可以把你的验证规则放在控制器中,或者使用formRequest进行验证。谢谢,这个很好用。