Laravel: 在更新时验证唯一性
Laravel: 在更新时验证唯一性
我知道这个问题已经被问过很多次了,但没有人解释在模型中进行验证时如何获取ID。\n\'email\' => \'unique:users,email_address,10\'
\n我的验证规则在模型中,所以我该如何将记录的ID传递给验证规则。\n这是我的models/User:\n
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" ];
\nmodels/BaseModel:\n
protected $rules = array(); public $errors; /* * @data: array, 要验证的数据 * @rules: string, 模型中的规则名称 */ public function validate($data, $rules = "rules") { $validation = Validator::make($data, $this->$rules); if($validation->passes()) { return true; } $this->errors = $validation->messages(); return false; }
问题的出现原因是用户希望在编辑记录时,能够更新除了唯一性验证字段之外的其他字段。解决方法是在验证规则中使用特定的语法来实现。
在使用资源控制器时,编辑记录的链接可能是以下两种形式之一:/users/{user}/edit
或者 /users/1/edit
。为了实现唯一性验证字段不被更新的功能,需要在 UserRequest 类的规则中添加特定的验证规则。
如果链接形式是 /users/{user}/edit
,可以使用以下代码来实现:
public function rules() { return [ 'name' => [ 'required', 'unique:users,name,' . $this->user ], ]; }
如果链接形式是 /users/edit/1
,可以使用以下代码来实现:
public function rules() { return [ 'name' => [ 'required', 'unique:users,name,' . $this->id ], ]; }
以上是最佳且最简洁的解决方法。通过在验证规则中添加特定的语法,可以实现唯一性验证字段不被更新的功能。
Laravel:在更新时验证唯一性的问题出现的原因是因为在更新模型时,我们想要验证某个字段的唯一性,但是默认的唯一性验证规则在更新操作中会忽略当前记录本身。解决方法是在控制器的更新方法中手动修改验证规则。
具体解决方法如下:
1. 在模型中定义验证规则数组$rules,其中包含需要验证唯一性的字段及其规则。例如:
protected $rules = [ 'email_address' => 'sometimes|required|email|unique:users', .. ];
2. 在控制器的更新方法中,获取原始的验证规则数组$rules,并根据当前记录的id修改email_address字段的验证规则。例如:
... $rules = User::$rules; $rules['email_address'] = $rules['email_address'] . ',id,' . $id; $validationCertificate = Validator::make($input, $rules);
然而,上述解决方法可能会遇到一个问题:无法访问受保护的属性App\User::$rules。这可能是因为Laravel版本不同导致的。根据原作者在2014年的回答,该解决方法适用于Laravel 4.x版本,而当前问题提问者所使用的是Laravel 7.x版本。因此,建议查看下方的其他回答,或在Stack Overflow上创建一个新问题,并将链接提供给我们以便帮助您解决该问题。
Laravel: 在更新时验证唯一性的问题出现的原因是为了避免更新数据时出现重复的字段。解决方法有两种,一种是在Form Request中进行验证,另一种是在控制器中直接验证。在Form Request中进行验证的方法是在规则数组中添加`'email' => 'required|email|unique:users,email,'.$this->user->id,`,其中`$this->user->id`表示当前用户的id。在控制器中直接验证的方法是使用`$request->validate()`函数,其中的规则数组与上述相同。需要注意的是,如果在更新时遇到访问`$this->user->id`时出现未定义属性的问题,需要使用`$this->user()->id`来代替。从Laravel 5.7开始,可以使用`Illuminate\Validation\Rule::unique()`来提供更优雅的验证方法,示例如下:`'email' => ['required', 'email', \Illuminate\Validation\Rule::unique('users')->ignore($this->user()->id)]`。此外,还可以根据具体需求添加其他规则,如必填和电子邮件规则。以上是关于如何在更新时验证字段唯一性的解决方法。