HTML表单包含选择下拉列表,其中包含现有类别列表,没有id = 0的类别。 CategoryStoreRequest必须检查表单中的category_id是属于现有类别还是0
像这样的东西
public function rules() {
return [
"name" => "required|min:3",
"category_id" => "required|exists:categories,id,except_if_value_is_0"
];
}
实现它的最优雅方式是什么?
答案 0 :(得分:2)
您可以将自定义零值设置为exists or 0
或空字符串,而不是检查NULL
。
您需要更改一些逻辑,但是您可以使用sometimes规则正确验证它:
public function rules() {
return [
"name" => "required|min:3",
"category_id" => "sometimes|exists:categories,id"
];
}
答案 1 :(得分:2)
事实证明,nullable
是一种非常优雅的方式。提交表单时,category_id数组键仍然存在,但其值为null。 nullable也允许键为空。
public function rules() {
return [
"name" => "required|min:3",
"category_id" => "nullable|exists:categories,id"
];
}
此外,选择值必须为“”
<select name="category_id">
<option value="">No category selection</option>
<option value="1">Cat 1</option>
</select>
答案 2 :(得分:1)
您可以使用sometimes
。在这种情况下,只有在提交了填充的category_id时才会应用该规则。
public function rules() {
return [
"name" => "required|min:3",
"category_id" => "sometimes|exists:categories,id"
];
}
更改您的HTML,以便设置无值:
<select name="category_id">
<option value="">No category selection</option>
<option value="1">Cat 1</option>
</select>
答案 3 :(得分:1)
您可以创建新的验证来处理 看这个例子: 在your_project_name / app / providers / AppServicesProviders.php
中Validator::extend(
'exists_or_null',
function ($attribute, $value, $parameters)
{
if($value == 0 || is_null($value)) {
return true;
} else {
$validator = Validator::make([$attribute => $value], [
$attribute => 'exists:' . implode(",", $parameters)
]);
return !$validator->fails();
}
}
);
在您的示例中这样做
public function rules() {
return [
"name" => "required|min:3",
"category_id" => "required|exists_or_null:categories,id"
];
}