Laravel Nova条件验证:required_if +存在规则

时间:2020-02-10 13:08:06

标签: php laravel laravel-validation laravel-nova

我正在尝试验证有关'parent_code'字段值的'level'属性

这就是我想要实现的目标:

'parent_code'为!= 0时,

'level'必需(此部分工作正常)

并且在设置后,它也必须存在于表'products'中('product_code':将使用的列名)

我当前的代码(无法正常工作)

产品资源类别

public function fields(Request $request) {
        return [
            ID::make()->sortable(),

            Text::make('Product code', 'product_code')
                ->rules('required')
                ->creationRules('unique:products,product_code')
                ->updateRules('unique:products,product_code,{{resourceId}}')->hideFromIndex(),


            Text::make('Product short name', 'product_short_name')->onlyOnForms(), 


            Textarea::make('Product name', 'product_name')
                ->rules('required')
                ->sortable()
                ->onlyOnForms(),

            Text::make('Parent code', 'parent_code')
                ->rules(['required_if:level,2,4,6', 'exists:products,product_code'])
                ->hideFromIndex(), 

            Select::make('Level', 'level')->options([
                '0' => 'Sector level',
                '2' => 'H2',
                '4' => 'H4',
                '6' => 'H6',
            ])->rules('required')->sortable(),    

        ];
}

创建产品表单

Create product form

谢谢您的帮助。

1 个答案:

答案 0 :(得分:3)

正确的方法是在验证程序实例上使用sometimes()方法,但是您不能从Laravel Nova规则中访问它。

您可以仅将rules定义为一个接收当前传入请求的闭包,并检查该值以动态地构建规则数组:

Laravel Collections解决方案

Text::make('Parent code', 'parent_code')
    ->hideFromIndex()
    ->rules(function ($request) {
        // You could also use "->when(...)" instead of "->unless(...)"
        // and invert the condition (first argument)
        return collect(['required_if:level,2,4,6'])
            ->unless($request->level === 0, function ($rules) {
                return $rules->push('exists:products,product_code');
            })
            ->toArray();
    }),

不使用集合的逻辑是相同的,只是使用基本的if语句来动态添加条件:

普通的PHP阵列解决方案

Text::make('Parent code', 'parent_code')
    ->hideFromIndex()
    ->rules(function ($request) {
        return [
            'required_if:level,2,4,6',
            ($request->level !== 0) ? 'exists:products,product_code' : '',
        ];
    }),

或(变体):

Text::make('Parent code', 'parent_code')
    ->hideFromIndex()
    ->rules(function ($request) {
        $rules = ['required_if:level,2,4,6'];

        if ($request->level !== 0) {
            $rules[] = 'exists:products,product_code';
        }

        return $rules;
    }),