Laravel: проверять целое поле, которое должно быть больше, чем другое
У меня есть два поля, которые являются необязательными, только если оба они отсутствуют:
$rules = [
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|integer|min:2|digits_between:1,5'
];
Теперь end_page
должно быть больше initial_page
. Как включить этот фильтр?
Ответы
Ответ 1
Существует нет встроенной проверки, которая позволит вам сравнивать значения полей, подобные этому в Laravel, поэтому вам нужно реализовать настраиваемый валидатор, что позволит вам повторно использовать валидацию там, где это необходимо. К счастью, Laravel делает написание пользовательского валидатора очень легким.
Начните с определения нового валидатора в yor AppServiceProvider:
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Validator::extend('greater_than_field', function($attribute, $value, $parameters, $validator) {
$min_field = $parameters[0];
$data = $validator->getData();
$min_value = $data[$min_field];
return $value > $min_value;
});
Validator::replacer('greater_than_field', function($message, $attribute, $rule, $parameters) {
return str_replace(':field', $parameters[0], $message);
});
}
}
Теперь вы можете использовать свое новое правило проверки в $правилах:
$rules = [
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|integer|greater_than_field:initial_page|digits_between:1,5'
];
Более подробную информацию о создании настраиваемых валидаторов вы найдете здесь: http://laravel.com/docs/5.1/validation#custom-validation-rules. Их легко определить и затем можно использовать везде, где вы проверяете свои данные.
Ответ 2
Для Laravel 5.4 это будет:
$rules = ['end_page'=>'min:'.(int)$request->initial_page]
Ответ 3
Я думаю, вы можете попробовать что-то вроде этого,
$init_page = Input::get('initial_page');
$rules = [
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|integer|min:'. ($init_page+1) .'|digits_between:1,5'
];
Ответ 4
Начиная с Laravel 5.6 gt
, lte
правила gte
, lt
и lte
.
Ответ 5
Почему бы просто не определить число $min_number = $min + 1
и использовать валидатор min:$min_number
, например:
$min = intval($data['min_number']) + 1;
return ['max_number' => 'required|numeric|min:'.$min];
И вы можете вернуть пользовательское сообщение об ошибке, чтобы объяснить ошибку пользователю.
Ответ 6
вопрос был задан в 2015 году, поэтому большинство ответов также устарели в 2019 году
Я хочу дать ответ, который использует функции, предоставленные командой laravel, которая включена в его новую версию,
так как @Sarpadoruk заявил, что в laravel 5.6 laravel добавил в валидацию такие функции, как gt
, gte
, lt
и lte
что означает:
-
gt
- больше чем -
gte
- больше чем равно -
lt
- меньше -
lte
- меньше чем равно
поэтому, используя gt
вы можете проверить, что ваша конечная страница должна быть больше начальной_страницы, и теперь ваша задача становится очень простой:
$rules = [
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|integer|gt:initial_page|digits_between:1,5'
];