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

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

ただいまの
回答率

88.77%

Laravel required_if について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,881

KenTse

score 20

前提・実現したいこと

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

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

名前 データ型
id int(10)
card_id int(10)
receipt_path varchar(255)
is_using tinyint(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 は空でなければならない。 これのやり方がよくわかりません。

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

該当のソースコード

//App\Http\Requests\StoreCardUsingRecordRequest

    public function rules()
    {
        return [
            'card_id'           => ['required', 'exists:' . (new Card)->getTable() . ',id'],
            'is_using'          => ['required', 'boolean'],
            'receipt_path'      => ['required_if:is_using,1', 'nullable', 'string'],
        ];
    }

試したこと

'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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/25 15:05

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

    キャンセル

  • 2019/12/25 15:06

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

    キャンセル

  • 2019/12/25 15:40

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

    キャンセル

check解決した方法

0

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

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

//App\Validator\CustomValidator


    /**
     * 他のフィールドが値のどれかと一致している場合、このフィールドが空であることをバリデートします。
     * eg. nullable_if:is_using,0
     * @param  string  $attribute
     * @param  mixed   $value
     * @param  mixed   $parameters
     * @return bool
     */
    public function validateNullIf($attribute, $value, $parameters)
    {
        $this->requireParameterCount(2, $parameters, 'null_if');

        $other = Arr::get($this->data, $parameters[0]);

        $values = array_slice($parameters, 1);

        if (is_bool($other)) {
            $values = $this->convertValuesToBoolean($values);
        }

        if (in_array($other, $values) && !empty($value) ) {
            return false;
        }

        return true;
    }
//App\Http\Requests\StoreCardUsingRecordRequest

    public function rules()
    {
        return [
            'card_id'           => ['required', 'exists:' . (new Card)->getTable() . ',id'],
            'is_using'          => ['required', 'boolean'],
            'receipt_path'      => [ 'required_if:is_using,1', 'null_if:is_using,0', 'numeric', 'nullable'],
        ];
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る