3

我有一个名为 Answer 的模型。

这个模型有两种可能的关系。一个Question或一个Product。但是,Answer 应该只有一个关系。问题或产品。

有一个表格可以创建答案。

此表单具有三个输入。其中两个是<select>输入。另一种是文本输入,称为名称。

我希望我的验证只允许填写一个。

我目前的验证:

$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:

<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 比较不同,此方法允许您针对没有值两个值返回单独的错误消息,而无需任何进一步的错误检查。

于 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 回答