具有自定义条件的Laravel验证

时间:2016-08-31 14:09:35

标签: validation laravel unique

我尝试使用条件设置验证规则但不知道如何执行以下操作:

在我的表单中,我有title_url(多语言版本的数组)。我想拥有唯一的title_url,但只有当表单中的module_cat_id与DB中的现有行具有相同的值时才会这样。

这是我的规则:

'title_url.*'   => 'required|min:3|unique:modules_cat_lang,title_url'

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以定义类似于以下代码的自定义:

\Validator::extend('custom_validator', function ($attribute, $value, $parameters) {
        foreach ($value as $v) {
            $query = \DB::table('modules_cat_lang') // use model if you have
                ->where('title_url', $v)
                ->where('module_cat_id', \Input::get('module_cat_id'));
            if ($query->exists()) {
                return false;
            }
        }
    });
'title_url.*'   => 'required|min:3|custom_validator'

在此处阅读更多https://laravel.com/docs/5.3/validation#custom-validation-rules

答案 1 :(得分:0)

如果您想将自己的自定义验证逻辑添加到现有的 Laravel 验证器中,那么您可以使用 after hooks。请看下面的例子。

参考:https://laravel.com/docs/8.x/validation#adding-after-hooks-to-form-requests

示例 1(无参数)

    $validator->after(function ($validator)  {
        if ('your condition') {
            $validator->errors()->add('field', 'Something went wrong!');
        }
    });

Example 2(With Parameter) // 这里可以传入一个自定义参数($input)

    $validator->after(function ($validator) use ($input)  {
        if ($input) {
            $validator->errors()->add('field', 'Something went wrong!');
        }
    });