🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

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

Q&A

解決済

2回答

9601閲覧

Laravel required_if について

KenTse

総合スコア24

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

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

0グッド

0クリップ

投稿2019/12/25 02:58

前提・実現したいこと

私は今、laravelでバリデーションて引っかかった事があります。
まず、カードの貸し借り+使用記録データのテーブルがあります。

テーブル中身はこんな感じ
table :card_using_records

名前データ型 
idint(10)
card_idint(10)
receipt_pathvarchar(255)
is_usingtinyint(1) laravelのboolean type
//他は関係ないのでSKIP

で、私の欲しいバリデーションはis_usingは1( true )の時にreceipt_pathは必須項目、これは
https://readouble.com/laravel/5.7/ja/validation.html#rule-url
を参考に

receipt_path => ['required_if:is_using,1', 'nullable', 'string']

これで問題ないです。

逆に、is_usingは0( false )の時に receipt_path は空でなければならない。
これのやり方がよくわかりません。

発生している問題・エラーメッセージ

該当のソースコード

php

1//App\Http\Requests\StoreCardUsingRecordRequest 2 3 public function rules() 4 { 5 return [ 6 'card_id' => ['required', 'exists:' . (new Card)->getTable() . ',id'], 7 'is_using' => ['required', 'boolean'], 8 'receipt_path' => ['required_if:is_using,1', 'nullable', 'string'], 9 ]; 10 }

試したこと

'receipt_path' => ['required_if:is_using,1', 'nullable', 'string', Rule::requiredIf(function () { return ( $this->get('is_using') === '0' && empty( $this->get('receipt_path') ) ); })],

↑うまく行きません、is_usingは1( true )の時にreceipt_pathは必須項目しかチェックのみチェックしています。

補足情報(FW/ツールのバージョンなど)

Laravel 5.7
PHP 7.2

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

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

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

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

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

guest

回答2

0

ルールの順番は変えてみましたか?

php

1'receipt_path' => ['nullable', 'required_if:is_using,1', 'string'],

あとはis_usingの場合はreceipt_path項目をPOSTさせないようにdisabledかけたり、バリデーションをかける前に値の処理(is_using0の場合はreceipt_path項目の値を空にする 等)行ったりもできるかと思います

投稿2019/12/25 03:28

編集2019/12/25 03:29
sola-msr

総合スコア876

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

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

KenTse

2019/12/25 05:22

ご返答ありがとうございます。 ルールの順番色々変えて見たけど、変わらないですね。 POSTさせないのはveiwのjavascriptの所やっていますが、クライアント側だからね、 サーバー側もやる必要があります。 で、一々バリデーションをかける前に値を処理するのはあんまりやりたくないですね、 ここ一つのフォームでなら問題ないですけど、後にCSVアップロードの大量データ保存のバリエーションも同じことをやるのでもう一回ループでやる分、遅くなります。 やっぱりバリデーションのルールでやりたいです。
sola-msr

2019/12/25 05:27

んーそうですね、、、is_usingの値はポストされてるか、中身の値の確認されましたか? (ポストされてないとか、0じゃないとか) あとはrequired_withを使うかでしょうか・・・
sola-msr

2019/12/25 06:05

Laravel5.3の情報みたいなので、5.7での方法を張っておきますhttps://readouble.com/laravel/5.7/ja/validation.html
sola-msr

2019/12/25 06:06

カスタムバリデーションルールの項を参考にしてください(php artisan make:rule Uppercase)
KenTse

2019/12/25 06:40

ご協力ありがとうございました、解決しました。
guest

0

自己解決

最終的には
https://qiita.com/komatzz/items/c64c83a004b7f2c63ce6

Illuminate\Validation\Concerns\ValidatesAttributes
のvalidateRequiredIfのfunctionを参考に
カスタマイズのバリデーションルール "null_if" を作りますた。

php

1//App\Validator\CustomValidator 2 3 4 /** 5 * 他のフィールドが値のどれかと一致している場合、このフィールドが空であることをバリデートします。 6 * eg. nullable_if:is_using,0 7 * @param string $attribute 8 * @param mixed $value 9 * @param mixed $parameters 10 * @return bool 11 */ 12 public function validateNullIf($attribute, $value, $parameters) 13 { 14 $this->requireParameterCount(2, $parameters, 'null_if'); 15 16 $other = Arr::get($this->data, $parameters[0]); 17 18 $values = array_slice($parameters, 1); 19 20 if (is_bool($other)) { 21 $values = $this->convertValuesToBoolean($values); 22 } 23 24 if (in_array($other, $values) && !empty($value) ) { 25 return false; 26 } 27 28 return true; 29 } 30

php

1//App\Http\Requests\StoreCardUsingRecordRequest 2 3 public function rules() 4 { 5 return [ 6 'card_id' => ['required', 'exists:' . (new Card)->getTable() . ',id'], 7 'is_using' => ['required', 'boolean'], 8 'receipt_path' => [ 'required_if:is_using,1', 'null_if:is_using,0', 'numeric', 'nullable'], 9 ]; 10 }

投稿2019/12/25 06:40

KenTse

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問