Cha*_*ynn 4 php laravel laravel-4 laravel-validation
我有一个名为“答案”的模型。
该模型有两种可能的关系。一个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);
});
Run Code Online (Sandbox Code Playgroud)
要求至少填写其中一项,但也允许填写两项。
所以,我的问题是:如何更改验证以仅允许填写其中一项选择。但其中一项必须始终填写。
选择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>
Run Code Online (Sandbox Code Playgroud)
选择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>
Run Code Online (Sandbox Code Playgroud)
@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.'
)
);
Run Code Online (Sandbox Code Playgroud)
您仍然应该将表单中的空值更改为<option value=''>None</option>。
与使用 XOR 比较不同,此方法允许您针对无值与两个值返回单独的错误消息,而无需任何进一步的错误检查。