2016-11-30 7 views
0

私はデータベースにslugカラムを持っています。それはユニークです。クエリ例外をキャッチしますか?

ユニークでないスラッグで別の行を試して保存しようとすると、QueryExceptionエラーが発生します。

私はエラーをキャッチし、 "スラッグが存在する"という行に沿ってエラーメッセージを返すことを望みます。

try { 
    User::create($data); 
} catch (\Illuminate\Database\QueryException $e) { 
    //return the error 
} 

は、上記の罰金ですが、私はちょうど別のQueryExceptionがスローされた場合、重複したスラグといけないこと、思ったんだけど、私は間違って重複したスラグのエラーメッセージを返します。

クエリ例外が何であったかを調べ、これに基づいてエラーメッセージを返す方法はありますか?私は例外がそれ自身のメッセージを提供することを知っているが、私はもう少しユーザーフレンドリーな何かを望んでいた。

+0

:あなたは様々なエラー(経由トリガなど)について知らせるためのMySQLに

例を、独自の信号を実装することができます。あなたが望むなら、それらを連鎖さえすることもできます。 – aynber

+0

aynber - OK一般的な例外をキャッチし、何?どのように私はそのdupキーのために把握するのですか? – panthro

+4

@panthroなぜあなたはこのアプローチにも従っています、なぜあなたは創造のために送られる前にスラグを検証していませんか?私はそれがラベール検証のためだと信じていますか? - > '$ rules = ['slug' => 'exists:users'];' – prateekkathal

答えて

4

あなたが得たかどうかを確認するには重複のためQueryExceptionの場合、$e->getCode()23000に等しいかどうかを確認してください。

制約のために重複が発生した場合、MySQLはsignal SQLSTATE 23000を発行し、正確に何が問題になったのかを判断できます。あなたが代わりに例外を指定する一般的な `Exception`をキャッチすることができます

try { 
    User::create($data); 
} catch (\Illuminate\Database\QueryException $e) { 
    if($e->getCode() === '23000') { 
     // you got the duplicate 
    } 
} 
1

あなたはそれがこのようになります例外オブジェクト

ののerrorInfoを確認することができます。..

+errorInfo: array:3 [▼ 
0 => "23000" 
1 => 1062 
2 => "Duplicate entry '[email protected]' for key 'users_email_unique'" 

あなたは、キャッチに以下のコードを書くことができます。..

try{} 
    catch(QueryException $qe){ 
    If ($qe->errorInfo[0] == "23000" && $qe->errorInfo[1] == "1062"){ 
     return "Your message" 
    }else{ 
     return "General Message" 
    } 
}