我正在尝试验证有关'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(),
];
}
创建产品表单
谢谢您的帮助。
答案 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;
}),