2016-11-08 4 views
1

私は現在、以下を試しています:dbには、一意のキーであるtemplateURLという列がありますので、一度しか存在しない可能性があります。次に何かが既に存在するものと同じフォームを送信しようとすると、 Integrity constraint violation: 1062 Duplicate entry for key 'templateURL'というエラーがスローされます。Laravel Eloquent Catch特別なエクスプレッション

もちろん、それは私が列をユニークにした理由です。しかし、私が欲しいのは、デフォルトのLaravel Errorではなく、まだ入力されている値とメッセージ(ブートストラップからのアラート、または入力フィールドの隣にあるdiv)からフォームに戻ることです。別のものを選んでください。だから私はこの例外をキャッチして、代わりにカスタムを行う必要があります。私は何をしたいのですか?

+0

このhttps://scotch.io/tutorials/laravel-form-validation – shoieb0101

+0

@ shoieb0101あなたは '$ rules'を使っていることを意味していますか?良い見えますが、私は私のコントローラにこれを置くことができます私は彼のように私のルートに入れなければならないのですか? – user5638730

+0

あなたの検証ルールをあなたのコントローラに入れたり、検証のためにformRequestを使うことができます。 https://laravel.com/docs/5.2/validation#form-request-validation – shoieb0101

答えて

1

try-catchブロックにデータベース操作をラップしてエラーをキャッチし、エラーが発生したときに何か他の操作をします。古い入力データをエラーメッセージとともにリダイレクトする可能性があります。

duplicate entryのエラーコードはです。したがって、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

+0

最初の答えに感謝します。何かが間違っているようですが、私はerrorCode 1062のキャッチで '' echo "test"を試みましたが、 '' test''エコーはありませんでしたが、laravelエラーが表示されます。また、私は(errorCode 1062がある場合)どのように入力された値を持つページに戻ってこれが既に存在することを示すメッセージを表示することができますか? – user5638730

+0

1062エラーコードはmysql用ですか? mysqlを使用していますか? echo "test"の代わりにリダイレクトを試みますか? –

+0

私は雄弁を使用していますので、mysql dbですが、私はそれを直接使用していませんが、エラーメッセージには1062も記載されています。しかし、私の答えのコメントは良く見え、簡単にフォームに戻ってきます。 – user5638730