質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

3189閲覧

Laravel5.1 FormRequestによるValidation

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2015/10/14 09:52

FormRequestでValidationを実装する際の、uniqueルールに関する質問です。

公式ドキュメントにあるように、レコードの更新処理の際unique制約を持つカラムに更新がない状態でもvalidationに引っかかることを防ぐために(レコード登録の際にのみunique制約を適応させるために)、第3引数でidを設定して強制的に無視するようにしたいのですが、formrequestで切り出している状況だと記載の通りには実装できません。
具体的には、

'カラム名' => 'required|unique:テーブル名',

とし、
・登録時
重複がある→エラー
重複がない→登録
・更新時
該当カラムに変更がある
重複がある→エラー
重複がない→更新
該当カラムに変更がない→更新
としたいと思っています。

ドキュメントでは、

'カラム名' => 'required|unique:テーブル名'.$var->id,

とすることで強制的にunique制約から抜けることができるとありますが、formrequest内で使うとうまく動作しません。

ざっくりとした概要で申し訳ないのですが、ご鞭撻のほどよろしくお願い致します。- リスト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

'カラム名' => 'required|unique:テーブル名,カラム名,'.$var->id,

だと思います。
動いているのはvendor/laravel/framework/src/illuminate/Validation/Validator.phpvalidateUniqueメソッドがuniqueのバリデーション判定です。
attributeはkeyに指定したカラム名です。valueはカラム名に入っている値です。parametersが:以降を,区切りに配列化したものが入っています。

中身を見ていただければ分かる通り、

$column = isset($parameters[1]) ? $parameters[1] : $attribute;

2つめのパラメータが入っていたらそれをカラム名と扱い、違ったらkeyをカラム名として扱います。
今回の場合だと、idがカラム名として取られてしまうのでエラーになります。

その後の処理にて、parameter[2]が存在する場合はgetUniqueIdsメソッドが動作するようになっています。

投稿2015/12/24 04:09

fagai

総合スコア2158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

スマートじゃないかもしれないですが、FormRequestのrules()の中で下記のようにしています。

自分のフォームの場合、リクエストにidが含まれている場合は「更新」のリクエストなので、
更新の時は、該当するレコードのidを除いてuniqueのチェックをしています。

php

1 /** 2 * Get the validation rules that apply to the request. 3 * 4 * @return array 5 */ 6 public function rules() 7 { 8 $rules = [ 9 'username' => 'required_without:id|max:20|unique:users', 10 'email' => 'required_without:id|email', 11 'password' => 'required_without:id', 12 'introduction' => 'required', 13 'website' => 'url', 14 ]; 15 16 if ($this->get('id')) { 17 $rules['username'] = 'required_without:id|max:20|unique:users,username,' . $this->get('id'); 18 } 19 20 return $rules; 21 }

投稿2016/01/08 09:07

yng13

総合スコア215

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

$var->idの前のカンマが抜けているからではないでしょうか

投稿2015/12/22 08:39

kinme

総合スコア843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問