Проверка входных данных исключительна или

У меня есть модель под названием Ответ.

Эта модель имеет два возможных отношения. Question или Product,
Но у ответа должно быть только одно отношение. Либо Вопрос, либо Продукт.

Есть форма для создания ответов.

Эта форма имеет три входа. два из них <select> входы. Другой текстовый ввод называется name.

Я хочу, чтобы моя проверка позволила заполнить только одну.

Моя текущая проверка:

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

2

Решение

Прежде всего. Вы должны указать пустое значение в опции «Нет»:

<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')
));
4

Другие решения

Пользовательское правило проверки XOR @ Razor довольно красиво, но есть другой путь, если вы не хотите создавать пользовательское правило. Вы можете добавить значения в 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, этот метод позволяет вам возвращать отдельные сообщения об ошибках для нет значений против два значения без дальнейшей проверки ошибок.

4

required_without правило проверки может быть то, что вы хотите:

Проверяемое поле должно присутствовать только тогда, когда любой из других
указанные поля отсутствуют.

Установить question поле для required_without:product и product поле для required_without:question,

0
По вопросам рекламы [email protected]