Laravel:更新时验证独一无二

2022-08-30 07:32:05

我知道这个问题以前已经问过很多次了,但是当你在模型中验证时,没有人解释如何获取id。

'email' => 'unique:users,email_address,10'

我的验证规则位于模型中,因此如何将记录的 ID 传递给验证规则。

这是我的模型/用户

protected $rules_update = [
    'email_address' => 'required|email|unique:users,email_address,'.$id,
    'first_name' => "required",
    'last_name' => "required",
    'password' => "required|min:6|same:password_confirm",
    'password_confirm' => "required:min:6|same:password",
    'password_current' => "required:min:6"
];

型号/基本模型

    protected $rules = array();

public $errors;

/*
    * @data: array, Data to be validated
    * @rules: string, rule name in model 
*/

public function validate($data, $rules = "rules") {

    $validation  = Validator::make($data, $this->$rules);

    if($validation->passes()) {
        return true;
    }

    $this->errors = $validation->messages();

    return false;
}

答案 1

只是一个旁注,这个问题的大多数答案都在谈论,而在Laravel的内置身份验证系统中,电子邮件字段名称只是。下面是一个示例,您可以验证唯一字段,即有关更新的电子邮件:email_addressemail

表单请求中,您这样做:

public function rules()
{
  return [
      'email' => 'required|email|unique:users,email,'.$this->user->id,
  ];
}

或者,如果您直接在控制器中验证数据:

public function update(Request $request, User $user)
{
  $request->validate([
      'email' => 'required|email|unique:users,email,'.$user->id,
  ]);
}

更新:如果要更新已登录的用户,并且未将模型注入路由,则在 访问 时可能会遇到未定义的属性。在这种情况下,请使用:Userid$this->user

public function rules()
    {
      return [
          'email' => 'required|email|unique:users,email,'.$this->user()->id,
      ];
    }

自Laravel 5.7以来,一种更优雅的方式是:

public function rules()
{
    return [
        'email' => ['required', 'email', \Illuminate\Validation\Rule::unique('users')->ignore($this->user()->id)]
    ];
}

P.S:我添加了一些其他规则,即必需规则和电子邮件,以便为新手清楚地说明此示例。


答案 2

一个简单的解决方案。

在模型中

protected $rules = [
    'email_address' => 'sometimes|required|email|unique:users',
    ..
];

在控制器中,操作:更新

...
$rules = User::$rules;
$rules['email_address'] = $rules['email_address'] . ',id,' . $id;
$validationCertificate  = Validator::make($input, $rules); 

推荐