Я должен проверить поле цены, которое должно быть больше нуля (допустимое значение 0,01), поэтому у меня есть следующая проверка:
$request->validate([
'product_price' => 'required|numeric|gt:0',
]);
Проблема в том, что когда я ввожу строку в поле product_price, я получаю сообщение об ошибке:
InvalidArgumentException The values under comparison must be of the same type
это почему? Я имею в виду, я проверяю, что оно должно быть числовым, прежде чем даже проверю, что оно> 0






Вы можете попробовать этот способ,
Перед вызовом функции Validator :: make () измените набор правил, добавив значение для сравнения, например:
use Illuminate\Support\Facades\Validator;
Validator::extend('greater_than', function ($attribute, $value, $otherValue) {
return intval($value) > intval($otherValue[0]);
});
$validation = Validator::make($input, ['amount' => 'required|numeric|greater_than:0']);
gt, gte, lt и lte добавлены в Laravel 5.6 и более поздних версиях, я предполагаю, что это должно быть причиной появления ошибки. (Хотя это работает для меня.)
Я думаю, ты можешь попробовать вот так
$request->validate([
'product_price' => 'required|numeric|min:0|not_in:0',
]);
min:0 убедитесь, что минимальное значение равно 0, а отрицательные значения недопустимы. not_in:0 проверяет, что значение не может быть равно 0. Итак, комбинация обоих этих правил делает свою работу.
Вы можете определить значимые сообщения об ошибках для определенного правила. (Вы можете добиться того же результата, используя регулярные выражения.)
Я еще не пробовал это, но я считаю, что это не сработает для меня, поскольку в вопросе четко указано, что 0,1 является допустимым значением, а ваш ответ ограничивает начальное значение> = 1
0.1 был примером. Еще раз, он должен быть больше нуля, но не нужно сужать его начальную точку до начального значения, поскольку 0,1, 0,01, 0,001 ... все допустимые значения.
Это правило допускает все числа больше 0 и меньше 10000. Включая десятичные числа, такие как 0,1, 0,001 и т. д. Это то, что вы хотите?
Извините, моя ошибка, я неправильно прочитал ответ. Один вопрос, можно ли в вашем ответе ноль? Потому что не должно. Извините за вопрос, просто я не смогу проверить это, пока не вернусь домой
Это работает как шарм! Просто нужно это проверить. Из всех решений, которые я видел в сети, ваше - самое прямое и чистое. Спасибо вам
Это то, что я хотел
Разве преобразование min:0 в min:1 не работает?
Для меня этот код работает в моем проекте.
$validation_rules = array(
'user_id' => 'required|integer|gt:0',
'type_id' => 'required|integer|gt:0',
);
$validation = Validator::make($request->all(), $validation_rules);
Здесь gt: 0 проверяет, больше ли целое число.
Надеюсь, это сработает для вас. Если нет, то проверьте свою версию Laravel.
Я вижу, что ни один из других ответов на самом деле не рассмотрел настоящую причину, по которой вы получаете эту ошибку, я постараюсь предоставить некоторые идеи и решение для нее.
Проблема здесь в том, что Laravel тестирует все правила валидации и не останавливается после первой ошибки валидации, которой в вашем случае является numeric (которая терпит неудачу, поскольку предоставленное значение является строкой), если он это сделал, ошибка с валидатором gt, предоставленным строковое значение не будет выбрано, поскольку валидатор уже завершил работу после ошибки numeric.
Чтобы Laravel остановил проверки валидации после первого неудачного правила валидации, вы можете префикс своих правил валидации с помощью валидатора bail, который в основном говорит Laravel остановиться после первой ошибки.
Полученный код будет выглядеть так:
$request->validate([
'product_price' => 'bail|required|numeric|gt:0',
]);
Обратите внимание, что это решение также делает так, чтобы для каждого поля всегда возвращалась только одна ошибка, если в вашем пользовательском интерфейсе вы обычно отображаете все ошибки для определенного поля за раз (вместо того, чтобы выбирать только первую из пакета сообщений), это решение изменило бы это.
Более подробную информацию о правиле проверки bail можно найти здесь: https://laravel.com/docs/6.x/validation#rule-bail
Для меня этот код работает в моем проекте,
use Validator;
$rules = [
'product_price' => 'required|gt:0',
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return response()->json(array('status' => false, 'msg' => $validator->errors()->first()));
exit;
}
Правило gt:
gt:field, по вашему делу вы дали 0. laravel.com/docs/5.7/validation#rule-gt