是否可以像这样的伪代码一样制作 Laravel 的验证规则?
field1 in modelA must be lower than sum of field2, field3 and field4 from modelB
我不知道该怎么做...
是否可以像这样的伪代码一样制作 Laravel 的验证规则?
field1 in modelA must be lower than sum of field2, field3 and field4 from modelB
我不知道该怎么做...
我不确定您是否需要与具有特定 ID 的 ModelB 或任何 ModelB 条目的最低总和进行比较,因此这里有两种情况的自定义验证规则。
lower:model_name,id,field_name1,field_name2,field_name3,...,field_nameN
您可以根据需要添加任意数量的求和字段(不仅仅是 3 个,如您的示例中所示)。验证器代码如下所示:
Validator::make(
array('field1' => 5),
array('field1' => 'lower:ModelB,1,field2,field3,field4')
);
验证规则如下所示:
Validator::extend('lower', function ($attribute, $value, $parameters)
{
// Get model name from first parameter
$modelName = array_shift($parameters);
// Get id from second parameter
$id = array_shift($parameters);
// Create a model instance
$model = App::make($modelName)->find($id);
// Calculate sum
$sum = array_sum(array_map(function ($field) use ($model) {
return $model->{$field};
}, $parameters));
// Return validation result
return $value < $sum;
});
lower:model_name,field_name1,field_name2,field_name3,...,field_nameN
与前面的规则相同,但没有 ID 作为第二个参数。验证器代码如下所示:
Validator::make(
array('field1' => 5),
array('field1' => 'lower:ModelB,field2,field3,field4')
);
验证规则如下所示:
Validator::extend('lower', function ($attribute, $value, $parameters)
{
// Get model name from first parameter
$modelName = array_shift($parameters);
// Calculate sum
$sum = App::make($modelName)->select(DB::raw('(' . implode('+', $parameters) . ') as sum'))->get()->min('sum');
// Return validation result
return $value < $sum;
});
这也可以使用表名而DB
不是模型来完成。