【问题标题】:Laravel validation uniqueLaravel 验证唯一
【发布时间】:2018-07-29 01:09:36
【问题描述】:

我有一个包含唯一列的表。 我的表单验证规则如下所示:

    return Validator::make($data, [
      'nameEN'   => 'required|string',
      'nameHE'   => 'required|string',
      'address'  => 'required|string|min:10|unique:clients'
    ]);

我的问题是,当我编辑一行时,如果我没有更改地址列,我会收到验证错误。

我的编辑功能如下所示:

public function editPost(Request $request,$id){
    $client = new Client();
    $client->editValidation($request->all())->validate();
    $row = $client->where('id',$id)->get()->first();
    $update = array();
    if(!empty($request->input("nameEN"))    && $request->input("nameEN")    != $row->nameEN) $update["nameEN"] = $request->input("nameEN");
    if(!empty($request->input("nameHE"))    && $request->input("nameHE")    != $row->nameHE) $update["nameHE"] = $request->input("nameHE");
    if(!empty($request->input("address"))   && $request->input("address")   != $row->address) $update["address"] = $request->input("address");

    if(empty($update)) $message = $this->message("info", "Notic: Client {$row->nameEN} was not updated because nothing was changed.");
    else if($client->where("id",$row->id)->update($update)){
        $message = $this->message("success", "Client {$row->nameEN} was updated.");
    } else {
        $message = $this->message("danger", "Error: Client {$row->nameEN} was not updated.");
    }
    $redirect = redirect("clients");
    if(isset($message)) $redirect->with("message",$message);
    return $redirect;
}

如果我从我的验证规则中删除 unique,我可能会遇到 mysql 错误。

如何解决?

提前谢谢你。

【问题讨论】:

    标签: php mysql validation laravel-5 laravel-5.6


    【解决方案1】:

    来自docs

    有时,您可能希望在唯一检查期间忽略给定的 ID, 指示验证器忽略对象的 ID

    'address'  => 'required|string|min:10|unique:clients,address,'.$id
    

    或者你可以使用 Rule 类来做到这一点

    use Illuminate\Validation\Rule;
    
    Validator::make($data, [
       'address' => [
            Rule::unique('clients')->ignore($id),
      ]
    ]);
    

    如果你的表使用了除id以外的主键列名,你可以在调用ignore方法时指定列名:

    'address' => Rule::unique('clients')->ignore($id, 'primary_key')
    

    【讨论】:

    • 谢谢你!这个忽略方法的第二个参数救了我的命。
    【解决方案2】:

    用于验证 laravel 5.6 上的唯一列:

    仅用于按需使用的字段:

    唯一:表、列、除外、idColumn

    'address'  => 'required|string|min:10|unique:clients,address,'.$id
    

    当您想使用单独的类进行验证时。我使用一个公共类来添加和更新:

    public function rules()
    {
      if($this->method() == 'POST')
          $address = 'required|string|min:10|unique:clients,address';
      else
         $address  = 'required|string|min:10|unique:clients,address,'.$this->id;
       //put a hidden input field named id with value on your edit view and catch it here; 
        return [
           'nameEN'   => 'required|string',
           'nameHE'   => 'required|string',
           'address'  => $address
        ];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-11
      • 2015-02-27
      • 2018-01-30
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      相关资源
      最近更新 更多