【问题标题】:Validating model realted to another in Laravel在 Laravel 中验证与另一个相关的模型
【发布时间】:2014-12-26 20:21:48
【问题描述】:

Laravel 的验证规则可以像这个伪代码一样吗?

field1 in modelA must be lower than sum of field2, field3 and field4 from modelB

我不知道该怎么做...

【问题讨论】:

  • 我猜field1 的值是传递给验证器的值。不清楚的是,您是否希望该值低于 ModelB 表中任何条目的总和,或者仅低于具有特定 ID 的 ModelB 类型的条目。

标签: laravel laravel-4 laravel-validation


【解决方案1】:

我不确定您是否需要与具有特定 ID 或任何 ModelB 条目的最低总和的 ModelB 进行比较,因此这里有两种情况的自定义验证规则。

1。再次比较具有特定 ID 的 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;
});

2。再次比较任何 ModelB 条目的最低总和:

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 而不是模型来完成。

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2020-04-18
    • 2021-01-07
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多