【问题标题】:Bypassing email = unique:users in laravel绕过电子邮件 = 唯一:laravel 中的用户
【发布时间】:2016-09-02 10:23:36
【问题描述】:

我正在使用 Laravel 5.2,我正在尝试创建一个仪表板,用户可以在其中更新他的信息,但我面临一个问题是绕过唯一性:验证器中的用户。

如果用户想要保留相同的电子邮件,验证器会给出“电子邮件已被占用”的错误,并且用户不应将电子邮件更改为另一个用户保留的电子邮件。

如果此用户是唯一拥有此电子邮件的用户,我该如何避免此验证。

我的控制器功能:

   public function update(Request $request)
{   

    $validator = Validator::make($request->all(), [
        'name'              => 'required|max:255',
        'email'             => 'required|email|max:255|unique:users',
        'password'          => 'required|min:6|confirmed',                  
    ]);

    // if fails, return response with errors
    if($validator->fails())
        return back()->withErrors($validator)->withInput();

    $user = Auth::user();
    $user->name             = $request->input('name');
    $user->email            = $request->input('email');
    $user->password         = bcrypt($request->input('password'));
    $user->update();


    return back()->withInput();
}

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    Laravel 的 unique 验证器可以采用额外的参数来帮助您从唯一检查中排除给定的 ID

    语法是:

    unique:<table>,<column>,<id_to_exclude>
    

    在您的情况下,您需要以下验证规则:

    'email' => 'required|email|max:255|unique:users,email,'.$id
    

    【讨论】:

    • 正是我想要的!谢谢你:)
    【解决方案2】:

    只需将您的代码更改为:

        public function update(Request $request)
         {   
        $id = Auth::user()->id;
        $validator = Validator::make($request->all(), [
            'name'              => 'required|max:255',
            'email'             => 'required|email|max:255|unique:users'.$id,
            'password'          => 'required|min:6|confirmed',                  
        ]);
    
        // if fails, return response with errors
        if($validator->fails())
            return back()->withErrors($validator)->withInput();
    
        $user = Auth::user();
        $user->name             = $request->input('name');
        $user->email            = $request->input('email');
        $user->password         = bcrypt($request->input('password'));
        $user->update();
    
    
        return back()->withInput();
    }
    

    为什么会这样?那么 laravel Unique validation 在指定的表中搜索唯一值。所以unique:users 搜索电子邮件是否存在于数据库中。此处的用户 id 用作排除该用户检查的一种方式。

    另外,如果您不希望该电子邮件被编辑,那么只需将其从请求中排除。

    $input = $request->excpet(['email']);检查docs

    【讨论】:

    • 在 unique:users 之后,我们必须添加所需的“电子邮件”列,然后添加所需用户的 ID。例如:'email' => 'unique:users,email,'.$user->id 它可以工作,谢谢 :)
    猜你喜欢
    • 2021-10-04
    • 2019-04-26
    • 2016-04-21
    • 2021-07-10
    • 1970-01-01
    • 2017-04-17
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多