2016-04-12 9 views
2

ユーザーあたり複数のアルバムを含むテーブル/モデルがあります。 列titleは一意でなければならないが、同じuser_idの行だけについては言えますか?IDが同じ場合、Laravelはユニークであることを確認します

例:あなたが例で見ることができるようにhttp://pastebin.com/8dvM4a1T

、2のIDを持つユーザーは、同じタイトルで、2枚のアルバムを作成しました。私はそれが許されたくないので、Laravelのバリデーターでそれを否定する方法があるのだろうかと思っています。

私はこれを試しましたが、うまくいきませんでした。

// Validator 
    $validator = Validator::make($input, [ 
     'title' => 'required|min:1|max:255|unique:galleries,title,'. Auth::user() -> id .',user_id', 
     'description' => 'min:1|max:255' 
    ]); 

ご協力いただきありがとうございます。

+0

何Laravelのバージョンを使用しているカスタムルールを書くことができますか? –

+0

私は現在5.2を使用しています – Kaizokupuffball

答えて

3

デフォルトのルールが機能しないuniqueとアプローチルールは、列の値が第3のパラメータとして渡されることを期待し、そうtitle列がものではありませんAuth::user()->id値に等しい場合は、あなたのケースでは、チェックしますので、あなたは欲しい。

Validator::extend('unique_custom', function ($attribute, $value, $parameters) 
{ 
    // Get the parameters passed to the rule 
    list($table, $field, $field2, $field2Value) = $parameters; 

    // Check the table and return true only if there are no entries matching 
    // both the first field name and the user input value as well as 
    // the second field name and the second field value 
    return DB::table($table)->where($field, $value)->where($field2, $field2Value)->count() == 0; 
}); 

あなたがunique_custom(またはあなたが好きそれに名前を付けることができます)ルールを使用することができます。

あなたはApp\Providers\AppServiceProviderクラスのbootメソッドに次のコードを追加することによって、あなたはカスタム検証ルールを所有作成することができますそのよう:

    012:

    $validator = Validator::make($input, [ 
        'title' => 'required|min:1|max:255|unique_custom:galleries,title,user_id,' . Auth::id(), 
        'description' => 'min:1|max:255' 
    ]); 
    

    ルールは以下のようにパラメータを期待します

  • 第一パラメータは、この場合には一意で、そのため値がユーザ入力から来ることになっているフィールド名であることをgalleries
  • 第二パラメータあるテーブル名、すべきこの場合title
  • 3番目のパラメータは、フィールド名の値となるように、この場合にuser_id
  • 4パラメーターされるクエリ条件に追加される第2のフィールド名となります合格第3のパラメータとして

Auth::id()を使用することもできます。Auth::user()->idという短い形式です。


Laravel Documentationでカスタム検証ルールについて詳しく読むことができます。

+0

ああ、そうです。それを説明してくれてありがとう。魅力のようにも機能します。 – Kaizokupuffball

+2

あなたは大歓迎です。また、デフォルトの 'unique'ルールを使用してそれを行うことができないということについて私は間違っていたようです。 @VipindasKSが[その他の回答](http://stackoverflow.com/a/36575405/351330)で非常によく指摘されているように、実際には第2の条件として追加の 'field'パラメータと' value'パラメータを渡すことができます。 – Bogdan

5

あなたのコードのようなものでなければなりません:

'title' => 'unique:galleries,title,NULL,id,user_id,'.Auth::user() -> id.'', 

それとも、あなたは Reference here

関連する問題