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

Laravel Nova Conditional Validation : required_if + exists rule

我正在尝试验证关于 'level' 字段值

'parent_code' 属性

这是我要实现的目标:

'parent_code' 仅当 'level' 是 != 0 时才需要 (这部分工作正常)

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

我当前的代码(不能正常工作)

产品资源class

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(),    

        ];
}

创建产品表单

感谢您的帮助。

正确的方法是在验证器实例上使用 sometimes() 方法,但您无法通过 Laravel Nova 规则访问它。

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

LaravelCollections解决方案

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();
    }),

不使用collections的逻辑是一样的,只是使用基本的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;
    }),