laravel 需要DB查询的表单请求自定义规则

b4wnujal  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(100)

在某些页面中,我需要将某个输入与某些查询结果进行匹配,并确保来自用户的输入不大于DB查询的结果(我将对某些列进行求和)。
对于这样的验证规则,我应该在表单请求中使用什么?我应该创建一个新规则,并将其命名为类似ValidCustomInputRule的名称,然后在那里执行DB查询,还是在表单请求中有更好的选项?

xmjla07d

xmjla07d1#

您可以在表单请求中创建自定义验证规则,并在规则本身中执行DB查询。
您可以创建自定义验证规则并在规则中使用

public function rules()
{
    return [
        'input_value' => ['required', new ValidCustomInputRule]
    ];
}

您可以使用php artisan make:rule ValidCustomInputRule来制作它

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\DB;

    class ValidCustomInputRule implements Rule
    {
        public function passes($attribute, $value)
        {
            $sum = DB::table('table_name')->sum('column_name');
    
            return $value <= $sum;
        }
    
        public function message()
        {
            return 'The input value is greater than the sum of the column in the database.';
        }
    }
rwqw0loc

rwqw0loc2#

我认为如果你想把所有的信息都保存在你的表单请求中,你可以使用闭包。

class YourFormRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'input_name' => [
                'required',
                'numeric',
                function (string $attribute, mixed $value, Closure $fail) {
                    $max = DB::table('table-table')->sum('column');

                    if ($value > $max) {
                        $fail("$attribute cannot be more than $max.");
                    }
                },
            ],
        ];
    }
}

如果这不起作用,我想您可以将其添加到after钩子中。

use Illuminate\Validation\Validator;

class YourFormRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'input_name' => [
                'required',
                'numeric',
            ],
        ];
    }

    public function withValidator(Validator $validator): void
    {
        $validator->after(function (Validator $validator) {
            $value = $validator->getData()['input_name'];
            $max = DB::table('table-table')->sum('column');

            if ($value > $max) {
                $validator->errors()->add('input_name', "input_name cannot be more than $max");
            }
        });
    }
}

相关问题