如果存在唯一属性,如何制定用于存储和更新用户的验证规则

How to make validation rules for storing and update users if there are unique attributes

我使用 username 作为 id 登录并使用户名和电子邮件成为唯一。 每当我创建用户名和电子邮件时,验证规则都会检查即将到来的数据并且没有问题,因为 usernameemail 将是新的和独特的。 当我更新时出现问题。当我更新属性时,我主要不需要更改用户名,但规则需要 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>';