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;
}),
我正在尝试验证关于 '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;
}),