是否可以像这个伪代码一样制作Laravel的验证规则?
field1 in modelA must be lower than sum of field2, field3 and field4 from modelB
我不知道,怎么做......
答案 0 :(得分:0)
我不确定您是否需要与具有特定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
代替模型来完成。