如何验证 Laravel 中值的总和?

How can I validate the sum of the values in Laravel?

我有 3 个输入标签,类型编号在 blade.php 中。我想验证总和是否等于 100。那么,该怎么做呢?感谢您的帮助。

Blade.php

<input type="number" name="number1" />
<input type="number" name="number2" />
<input type="number" name="number3" />

控制器

 public function store(Request $request) {
    $data = $request->validate([
       'number1' => 'required',
       'number2' => 'required',
       'number3' => 'required',
    ]);
    $sum = $data['number1'] + $data['number2'] + $data['number3'];
    $myDb = new Mynumber();
    $myDb->number1 = $data['number1'];
    $myDb->number2 = $data['number2'];
    $myDb->number3 = $data['number3'];
    $myDb->save();
 }

如果您想留在 Laravels 验证器的边界内,我建议您使用 after 验证挂钩或创建一个临时字段(在 PHP 内,不要使用客户端这项工作的技术!)加上所有必要字段的总和并根据它进行验证。

$validator = Validator::make([
    'field1' => 50,
    'field2' => 25,
    'field3' => 22,
], [
    'field1' => 'required|numeric',
    'field2' => 'required|numeric',
    'field3' => 'required|numeric',
]);

$validator->after(function ($validator) {
    if ($validator->getData()['field1'] + $validator->getData()['field2'] + $validator->getData()['field3'] !== 100) {
        $validator->errors()->add('field1', 'Make sure the sum of all fields equals 100.');
    }
});

您可以通过在服务提供商中添加新规则来扩展验证器:

$validator->extend("sumsTo", function ($attribute, $value, $parameters) {
   $expected = floatval(array_shift($parameters));
   $otherParameters = request()->only($parameters);
   return floatval(array_sum(array_merge(array_values($otherParameters), [ $value ]))) === $expected;
});

那么您可以将其用作:

$request->validate([
      'field1' => 'sumsTo:100,field2,field3',
      'field2' => 'sumsTo:100,field1,field3'
      'field3' => 'sumsTo:100,field1,field2'
]);

这也会将所有 3 个字段标记为失败。