У меня есть модель под названием Ответ.
Эта модель имеет два возможных отношения. 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>
Прежде всего. Вы должны указать пустое значение в опции «Нет»:
<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')
));
Пользовательское правило проверки 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, этот метод позволяет вам возвращать отдельные сообщения об ошибках для нет значений против два значения без дальнейшей проверки ошибок.
required_without
правило проверки может быть то, что вы хотите:
Проверяемое поле должно присутствовать только тогда, когда любой из других
указанные поля отсутствуют.
Установить question
поле для required_without:product
и product
поле для required_without:question
,