Laravel - пользовательская проверка - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть это подтверждение:

$data = request()->validate([
        'qty100' => ['integer'],
        'qty250' => ['integer'],
        'qty500' => ['integer'],
    ]);

Мне нужно проверить, если хотя бы один из них больше 0 ... как это можно сделать?

1 Ответ

2 голосов
/ 09 апреля 2020

Я думаю, что в Laravel нет встроенного правила валидации, что-то похожее на то, что вы хотите, поэтому вам нужно будет реализовать собственный валидатор, который позволит вам повторно использовать валидацию там, где это необходимо.

это один из способов сделать это.

    request()->validate([
        'intone' => ['required', 'integer', 'greaterThanZeroWithoutAll:inttwo,intthree'],
        'inttwo' => ['required', 'integer'],
        'intthree' => ['required', 'integer'],
    ]);

в вашем AppServiceProvider

    public function boot()
    {
        //here we are creating a custom rule. called 'greaterThanZeroWithoutAll'
        //$attribute is the name we are validating,
        //$value is the value we get from the request,
        //$parameters are the arguments we pass in like greaterThanZeroWithoutAll:inttwo,intthree inttwo and intthree are parameters 
       //$validator is the validator object.

        Validator::extend('greaterThanZeroWithoutAll', function ($attribute, $value, $parameters, $validator) {
            //$validator->getData() is all the key value pairs from greaterThanZeroWithoutAll rule.
           //array_values($validator->getData()) we are only interested in the values, so this will return all the values.
           //implode(array_values($validator->getData())) will turn it into string
           //!(int) implode(array_values($validator->getData())) this uses no glue when imploding, then explicitly casts the generated string as an integer, then uses negation to evaluate 0 as true and non-zero as false. (Ordinarily, 0 evaluates as false and all other values evaluate to true.)

            if (!(int) implode(array_values($validator->getData()))) {
              //means all values are 0
                return false;
            }

            return true;
        });
        // this is error message
        Validator::replacer('greaterThanZeroWithoutAll', function ($message, $attribute, $rule, $parameters) {
            return 'not all fields are greater 0';
        });
    }

!(int) implode(array_values($validator->getData())) этот код в основном проверяет, что все значения равны нулю, должно быть много других способов сделайте это.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...