需要Laravel验证|存在0,但0

时间:2017-06-14 09:02:54

标签: php laravel validation laravel-5

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"
    ];
}

实现它的最优雅方式是什么?

4 个答案:

答案 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"
];

}