【问题标题】:Laravel validation required|exists with exception of 0需要 Laravel 验证|存在,但 0 除外
【发布时间】:2017-11-16 08:04:29
【问题描述】:

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

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

【问题讨论】:

  • 你的问题有点混乱?请多解释一下

标签: php laravel validation laravel-5


【解决方案1】:

事实证明,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>

【讨论】:

  • 好吧,那么空值将通过 nullable 规则,但不会通过 exists 规则 IIRC。
  • 这就是重点。如果给出值,那么它必须通过存在规则。否则只允许一个例外。
【解决方案2】:

您可以创建新的验证来处理 看这个例子: 在 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"
];

}

【讨论】:

    【解决方案3】:

    您可以将自定义零值设置为NULL 或空字符串,而不是检查exists or 0

    您需要更改一些逻辑,然后您可以使用sometimes 规则正确验证它:

    public function rules() {
        return [
            "name" => "required|min:3",
            "category_id" => "sometimes|exists:categories,id"
        ];
    }
    

    【讨论】:

      【解决方案4】:

      您可以使用sometimes。在这种情况下,只有在提交填充的 category_id 时才会应用该规则。

      public function rules() {
          return [
              "name" => "required|min:3",
              "category_id" => "sometimes|exists:categories,id"
          ];
      }
      

      更改您的 html,以便设置 no value

      <select name="category_id">
          <option value="">No category selection</option>
          <option value="1">Cat 1</option>
      </select>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-04
        • 2017-10-13
        • 1970-01-01
        • 2018-08-18
        • 2015-09-22
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多