更新特定用户时,我想对“用户名”和“studentNumber”字段运行
unique
验证,但仅适用于其他用户,而不适用于正在更新的同一用户,因为该用户已归他们所有。如果我仅使用 unique:users
,则会在更新时导致错误,因为它将针对用户本身运行验证。相反,我使用 Rule::unique('users')->ignore($user->id)
忽略正在更新的用户,但我需要将正在更新的用户的 id 传递给 Form Request
。我该如何实现这个目标?
UserController.php
public function update(UpdateUserRequest $request, string $id)
{
try{
DB::table('users')->where('id',$id)->update($request->validated());
}catch(Exception $ex){
return response()->json(['message' => $ex->getMessage()], 409);
}
}
更新用户请求.php
public function rules(): array
{
return [
'username' => [ Rule::unique('users')->ignore($user->id), 'string', 'max:255'],
'studentNumber' => [ Rule::unique('users')->ignore($user->id), 'string'],
];
}
为什么不先验证然后尝试更新?
您可以使用这两个示例之一:
public function update(UpdateUserRequest $request, string $id)
{
$validator = Validator::make($request->all(), $request->rules());
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
$user = User::findOrFail($id);
$user->update($request->all());
...
public function update(UpdateUserRequest $request, string $id)
{
$validData = $request->validated();
// if not valid it throws error or anything you change in failedValidation() method
$user = User::findOrFail($id);
$user->update($validData);
...