Laravel 使用唯一验证规则来更新模型属性
Laravel 使用唯一验证规则来更新模型属性
我有一个Laravel的User
模型,其中username
和email
都有唯一性验证规则。在我的Repository中,当我更新模型时,我重新验证字段,以避免出现必需规则验证的问题:
public function update($id, $data) { $user = $this->findById($id); $user->fill($data); $this->validate($user->toArray()); $user->save(); return $user; }
在测试中,这会失败并显示如下错误信息:
ValidationException: {"username":["The username has already been
taken."],"email":["The email has already been taken."]}
有没有一种优雅的方法来解决这个问题?
这段代码中的问题是在更新用户信息时没有进行唯一性验证。为了解决这个问题,作者定义了一个validate方法来进行验证,并在update方法中调用了这个方法。validate方法中根据传入的id参数,对username和email字段的验证规则进行了修改,加上了唯一性验证。如果验证失败,将抛出一个ValidationException异常。
另外,还有使用Form Requests可以更简单地实现这个功能。作者创建了一个UpdateUserRequest类,通过重写authorize和rules方法来实现授权和验证规则的定义。在rules方法中,通过使用unique规则并传入当前请求的id来实现唯一性验证。
要解决这个问题,只需要将UpdateUserRequest类传递给update方法,并确保在请求中POST了模型的id。
问题的原因是在更新用户信息时没有进行唯一性验证,解决方法是通过自定义validate方法或使用Form Requests来实现唯一性验证。
问题的原因是在Laravel中更新模型时,对模型的某个属性应用了唯一性验证规则,但是默认的验证规则无法满足需求。解决方法是在模型中创建一个静态函数,通过该函数返回包含唯一性验证规则的数组,并在更新操作时传递相应的参数。
在解决方法中,首先在模型中创建了一个静态函数`rules`,该函数接受两个参数`$id`和`$merge`,默认值分别为0和一个空数组。在该函数中,通过`array_merge`函数将默认的验证规则数组与传入的`$merge`数组合并,构成最终的验证规则数组。其中,`$id`参数用于在更新操作中指定要排除的记录,以确保唯一性验证规则不会与当前记录冲突。
在创建操作中,使用`Validator::make`函数将输入数据和模型的验证规则进行验证,其中模型的验证规则通过调用`User::rules()`函数获取。
在更新操作中,除了调用`User::rules()`函数获取模型的验证规则外,还需要传递模型的ID作为参数,以排除当前记录的验证规则。
如果还需要在更新操作中添加一些额外的验证规则,可以定义一个`$extend_rules`数组,并将其传递给`User::rules()`函数。
通过以上方法,可以实现在更新模型时对某个属性应用唯一性验证规则的功能。
非常好!为了使我的代码按照这种方式工作,我需要以下内容:'email' => 'required|email|unique:member'. ($id ? ",id,$id" : '')
在Laravel中更新模型并为属性设置唯一验证规则的问题的出现原因是需要在更新模型时排除当前实例的id。为了解决这个问题有两种方法:
1. 将实例的id传递给唯一验证器,以忽略唯一验证规则。
2. 在验证器中使用一个参数来检测是更新还是创建资源。
如果是更新操作,强制唯一规则忽略给定的id:
//规则 'email' => 'unique:users,email_address,' . $userId,
如果是创建操作,按照通常的方式进行:
//规则 'email' => 'unique:users,email_address',
所以用户ID与电子邮件地址有关吗?假设你要更新已经存在的电子邮件地址,那么如何找到它呢?请参考这个问题:stackoverflow.com/questions/39591620/…
这个解决方法对于我来说是最好的,谢谢!