2017-12-05 27 views
1

Laravelには 'except'句を持つ '一意の'ルールがあります。妥当性確認のドキュメントからは、次の形式が使用されます。Laravel:フォーム要求の検証で無視ルールを使用する方法

unique:table,column,except,idColumn 

私のアプリケーションには「ショップ」エンティティがあります。

public function rules() 
{ 
    return [ 
     'shop.name' => 'required|string|max:100|unique:shops,name,except,id', 
    ]; 
} 

(私のshopsテーブルの主キーがidです):ユーザーがお店のプロフィールを更新するよう構成された検証ルールは、以下で、私は、フォームの要求を持っています。

問題は、Laravelが 'except'節の通知を受けないということです。ショップIDがフォーム要求に挿入されていないため、これは意味があります(並べ替え)。私はちょうど別のフォーム値としてidを注入することができますが、それは動作していないようです。

フォームリクエストでこのルールを使用するにはどうすればよいですか? uniqueルールにexcept句を使用するには

答えて

4

、我々はルールがルール自体に直接を無視するレコードのフィールドの値を提供する必要があります。リクエストの更新は、我々は無視するIDフィールドの値を追加する必要があることを記録上のため除くすべてのレコードのためのユニークなname分野たいのであれば

、:示されているように

class UpdateShopRequest extends FormRequest 
{ 
    ... 
    public function rules() 
    { 
     return [ 
      'shop.name' => 'unique:shops,name,' . $this->shop['id'], 
     ]; 
    } 
} 

を、 が含まれていて、その行のid$this->shop['id']と一致しない場合、このルールは検証に失敗します。

<input type="hidden" name="shop[id]" value="{{ $shop->id }}"> 

...我々ができるように私たちが要求内の値を取得することができます:この例では、質問は、アレイ入力の検証を行っているので、私たちのフォームは、レコードのID属性の配列入力フィールドが含まれていることを前提としてい他の要求。

$shopId = $this->route('id'); 

...私たちはと同様に定義されたルートがある場合に動作します:

Route::post('shops/{id}', ...); 
をより典型的には、我々は、要求のroute()メソッドを使用して取得することができ、ルートパラメータとしてレコードIDを渡します

unique検証ルールの4番目のパラメータは、except句が適用される列を指定します。既定値はidです。したがって、レコードのIDを比較するだけの場合は省略することができます。

特に、多くの他のルールを持つフィールドの場合は、列の値を連結するだけでルールはちょっと面倒です。バージョン5.3以来、Laravelはexcept句でuniqueルールを作成するには、よりエレガントな構文を提供します。

use Illuminate\Validation\Rule; 
... 
return [ 
    'shop.name' => [ 
     'required', 
     'string', 
     'max:100', 
     Rule::unique('shops', 'name')->ignore($shopId, 'optional_column'), 
    ], 
]; 
+1

おかげでサイ、それは優秀な説明です...私は、フォームのリクエストがまだあったという事実の視力を失っていましたただのリクエスト! –

関連する問題