如果存在唯一属性,如何制定用于存储和更新用户的验证规则
How to make validation rules for storing and update users if there are unique attributes
我使用 username
作为 id
登录并使用户名和电子邮件成为唯一。
每当我创建用户名和电子邮件时,验证规则都会检查即将到来的数据并且没有问题,因为 username
和 email
将是新的和独特的。
当我更新时出现问题。当我更新属性时,我主要不需要更改用户名,但规则需要 unique, username
。
使用验证规则更新唯一属性的最佳做法是什么?。
更新用户方法
public function updateUser($req, $id)
{
$user = User::where('user_id', $id)->firstOrFail();
$user->username = $req->input('username');
$user->password = Hash::make($req->input('password'));
$user->email = $req->input('email');
$user->first_name = $req->input('first_name');
$user->last_name = $req->input('last_name');
$user->phone = $req->input('phone');
$user->emergency_phone = $req->input('emergency_phone');
$user->profile_photo = $req->input('profile_photo');
$user->role = $req->input('role');
$user->status = $req->input('status');
$user->save();
return $this->filterUsers([$user]);
}
规则
protected $rules = [
'username' => 'required|max:20|unique:users',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required',
// **in Production **
// 'password' => [
// 'required',
// 'min:6',
// 'regex:/^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\d\X])(?=.*[!$#%]).*$/',
// 'confirmed'
// ],
/**
* Three of the five rules.
* English uppercase characters (A – Z)
* English lowercase characters (a – z)
* Base 10 digits (0 – 9)
* Non-alphanumeric (For example: !, $, #, or %)
* Unicode characters
*/
'first_name' => 'required|string|max:255',
'last_name' => 'required|string|max:255',
'phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:5',
'role' => 'required'
];
您需要在控制器 Use Validator;
中使用 laravel 验证器 class
并使用这样的东西:
$error = Validator::make($req->all(), $rules);
验证文档中有更多示例here。
在编辑时它会检查唯一的用户名,因此我们避免当前编辑 ID 的唯一性
在更新方法中,您的验证规则如下:
protected $rules = [
'username' => 'required|max:20|unique:users,username,' . $id',
'email' => 'required|string|email|max:255|unique:users,email,' . $id',
'password' => 'required',
'first_name' => 'required|string|max:255',
'last_name' => 'required|string|max:255',
'phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:5',
'role' => 'required'
];
您可以使用
'username' => 'required|max:20|unique:users,username,' . $id',
如果你的用户 table 主键是 id
,如果它是 user_id
之类的其他东西,那么它将变成
'username' => 'required|email|unique:user,username,' . $request->input('user_id') . ',userid',
所以语法是
'input_field' => 'unique:<table name>,<column name for this input field>, <unique id>, <unique id column in table>';
我使用 username
作为 id
登录并使用户名和电子邮件成为唯一。
每当我创建用户名和电子邮件时,验证规则都会检查即将到来的数据并且没有问题,因为 username
和 email
将是新的和独特的。
当我更新时出现问题。当我更新属性时,我主要不需要更改用户名,但规则需要 unique, username
。
使用验证规则更新唯一属性的最佳做法是什么?。
更新用户方法
public function updateUser($req, $id)
{
$user = User::where('user_id', $id)->firstOrFail();
$user->username = $req->input('username');
$user->password = Hash::make($req->input('password'));
$user->email = $req->input('email');
$user->first_name = $req->input('first_name');
$user->last_name = $req->input('last_name');
$user->phone = $req->input('phone');
$user->emergency_phone = $req->input('emergency_phone');
$user->profile_photo = $req->input('profile_photo');
$user->role = $req->input('role');
$user->status = $req->input('status');
$user->save();
return $this->filterUsers([$user]);
}
规则
protected $rules = [
'username' => 'required|max:20|unique:users',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required',
// **in Production **
// 'password' => [
// 'required',
// 'min:6',
// 'regex:/^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\d\X])(?=.*[!$#%]).*$/',
// 'confirmed'
// ],
/**
* Three of the five rules.
* English uppercase characters (A – Z)
* English lowercase characters (a – z)
* Base 10 digits (0 – 9)
* Non-alphanumeric (For example: !, $, #, or %)
* Unicode characters
*/
'first_name' => 'required|string|max:255',
'last_name' => 'required|string|max:255',
'phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:5',
'role' => 'required'
];
您需要在控制器 Use Validator;
并使用这样的东西:
$error = Validator::make($req->all(), $rules);
验证文档中有更多示例here。
在编辑时它会检查唯一的用户名,因此我们避免当前编辑 ID 的唯一性
在更新方法中,您的验证规则如下:
protected $rules = [
'username' => 'required|max:20|unique:users,username,' . $id',
'email' => 'required|string|email|max:255|unique:users,email,' . $id',
'password' => 'required',
'first_name' => 'required|string|max:255',
'last_name' => 'required|string|max:255',
'phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:5',
'role' => 'required'
];
您可以使用
'username' => 'required|max:20|unique:users,username,' . $id',
如果你的用户 table 主键是 id
,如果它是 user_id
之类的其他东西,那么它将变成
'username' => 'required|email|unique:user,username,' . $request->input('user_id') . ',userid',
所以语法是
'input_field' => 'unique:<table name>,<column name for this input field>, <unique id>, <unique id column in table>';