Laravel: проверка числа больше нуля не работает

Я должен проверить поле цены, которое должно быть больше нуля (допустимое значение 0,01), поэтому у меня есть следующая проверка:

$request->validate([
            'product_price' => 'required|numeric|gt:0',
        ]);

Проблема в том, что когда я ввожу строку в поле product_price, я получаю сообщение об ошибке:

InvalidArgumentException The values under comparison must be of the same type

это почему? Я имею в виду, я проверяю, что оно должно быть числовым, прежде чем даже проверю, что оно> 0

Правило gt: gt:field, по вашему делу вы дали 0. laravel.com/docs/5.7/validation#rule-gt

Wreigh 19.09.2018 09:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
22
1
42 656
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете попробовать этот способ,

Перед вызовом функции 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

MrCujo 19.09.2018 11:00

0.1 был примером. Еще раз, он должен быть больше нуля, но не нужно сужать его начальную точку до начального значения, поскольку 0,1, 0,01, 0,001 ... все допустимые значения.

MrCujo 19.09.2018 11:04

Это правило допускает все числа больше 0 и меньше 10000. Включая десятичные числа, такие как 0,1, 0,001 и т. д. Это то, что вы хотите?

Tharindu Thisarasinghe 19.09.2018 11:07

Извините, моя ошибка, я неправильно прочитал ответ. Один вопрос, можно ли в вашем ответе ноль? Потому что не должно. Извините за вопрос, просто я не смогу проверить это, пока не вернусь домой

MrCujo 19.09.2018 11:15

Это работает как шарм! Просто нужно это проверить. Из всех решений, которые я видел в сети, ваше - самое прямое и чистое. Спасибо вам

MrCujo 20.09.2018 04:01

Это то, что я хотел

Pratik Patel 18.12.2018 13:32

Разве преобразование min:0 в min:1 не работает?

Daniyal Nasir 17.03.2021 19:34

Для меня этот код работает в моем проекте.

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

Другие вопросы по теме