3

Answerというモデルがあります。

このモデルには 2 つの関係があります。QuestionまたはProduct。_ ただし、Answer のリレーションは 1 つだけにする必要があります。質問または製品のいずれか。

回答を作成するためのフォームがあります。

このフォームには 3 つの入力があります。そのうちの 2 つは<select>入力です。もう 1 つは名前と呼ばれるテキスト入力です。

検証で 1 つだけ入力できるようにしたい。

私の現在の検証:

$validator = Validator::make(
    Input::all(),
    array('name' => array('required'))
);

$validator->sometimes('product', array('required', 'numeric'), function ($input) {
    return !is_numeric($input->question);
});

$validator->sometimes('question', array('required', 'numeric'), function ($input) {
    return !is_numeric($input->product);
});

選択した項目の少なくとも 1 つを入力する必要がありますが、2 つ入力することもできます。

だから、私の質問は次のとおりです。選択したものの1つだけを入力できるように検証を変更するにはどうすればよいですか。ただし、そのうちの 1 つは必ず入力する必要があります。

1 を選択:

<select name="question" class="form-control">
    <option>None</option>
    <option value="1" selected="selected">Question 1</option>
    <option value="2">Question 2</option>
</select>

2 を選択:

<select name="product" class="form-control">
    <option>None</option>
    <option value="2" selected="selected">Product 1</option>
    <option value="3">Product 2</option>
</select>
4

3 に答える 3

4

@Razor のカスタム XOR 検証ルールは非常に優れていますが、カスタム ルールを作成したくない場合は別の方法があります。Inputを使用して制約を表す値を追加しInput::merge、それらを検証に使用できます。

Input::merge(array(
    'hasBoth'    => Input::has('product')  && Input::has('question'),
    'hasNeither' => !Input::has('product') && !Input::has('question')
));

$validator = Validator::make(
    Input::all(), array(
        'name'       => 'required',
        'hasNeither' => 'size:0',
        'hasBoth'    => 'size:0',
    ), array(
        'hasNeither.size' => 'A question or a product is required.',
        'hasBoth.size'    => 'You cannot choose both a question and a product.'         
    )
);

フォームの空の値を に変更する必要があります<option value=''>None</option>

XOR 比較を使用する場合とは異なり、このメソッドを使用すると、値がない場合と 2 つの値の場合で、それ以上のエラー チェックを行わなくても、個別のエラー メッセージを返すことできます

于 2014-10-29T00:18:37.203 に答える
4

最初に。「なし」オプションに空の値を指定する必要があります。

<option value=''>None</option>

XOR演算子を探しています。この場合、カスタム検証ルールを作成する必要があります。

Validator::extendImplicit('xor', function($attribute, $value, $parameters)
{
    if( $value XOR app('request')->get($parameters[0]))
        return true;
    return false;
});
Validator::replacer('xor', function($message, $attribute, $rule, $parameters)
{
    // add indefinite articles
    $IAattribute = (stristr('aeiou', $attribute[0]) ? 'an ' : 'a ') . $attribute;
    $parameters[0] = (stristr('aeiou', $parameters[0][0]) ? 'an ' : 'a ') . $parameters[0];

    if(app('request')->get($attribute))
        return 'You cannot choose both '.$IAattribute.' and '.$parameters[0].'.';
    return $IAattribute.' or '.$parameters[0].' is required.';
});


$validator = Validator::make(
    app('request')->all(),
    array('name' => array('required')
    ,'product' => array('xor:question')
));
于 2014-10-28T17:28:04.240 に答える
1

required_without 検証ルールは、あなたが望むものかもしれません:

検証中のフィールドは、他の指定されたフィールドが存在しない場合にのみ存在する必要があります。

questionフィールドをrequired_without:productに、productフィールドを に設定しますrequired_without:question

于 2014-10-24T12:10:32.217 に答える