如何强制唯一规则忽略给定的ID?

时间:2018-08-02 06:46:22

标签: laravel laravel-5.6

在更新“用户”表时,我希望EditUserRequest表单检出忽略当前电子邮件,因为它已经存在。 代码规则:

public function rules()
{
    return [
        'username' => 'required|max:200',
        'email' =>  [
                        'required',
                        Rule::unique('users')->ignore($user->id),
                    ],
        'pass1' => 'required|min:6',
        'pass2' => 'same:pass1',
    ];
}

代码UserController:

public function postEdit($id,EditUserRequest $request)
{
    $user = User::find($id);
    $user->name = $request->username;
    $user->email = $request->email;
    $user->password = Hash::make($request->pass1);
    $user->level = $request->get('cbadmin',0);
    $user->save();
    return view('admin.edit-user')->with('success','Sửa thành công!');
}

此行:'email' => 'required|email|unique:users,email'将检查电子邮件是否存在。但是,我需要更新的默认电子邮件已经存在。我读过:https://laravel.com/docs/5.6/validation#rule-unique。但是我不明白如何解决这个问题

4 个答案:

答案 0 :(得分:2)

public function rules()
    {
        return [
            'username' => 'required|max:200',
            'email' => 'required|email|unique:users,email,'.request()->user()->id,
            'pass1' => 'required|min:6',
            'pass2' => 'same:pass1',
        ];
    }

您可以将第三个参数作为id传递。

希望这会有所帮助。

答案 1 :(得分:1)

您可以通过使用Rule Facade来做到这一点。

'email' => [
    'required',
    Rule::unique('users')->ignore($user->id),
],

编辑

如果您使用函数来验证输入,则可以这样操作:

protected function yourValidatorName(array $data, $id)
{
    return Validator::make($data, [
        'username' => 'required|max:200',
        'email' =>  [
            'required',
             Rule::unique('users')->ignore($id),
        ],
        'pass1' => 'required|min:6',
        'pass2' => 'same:pass1',
    ]);
}

然后

public function postEdit($id, EditUserRequest $request)
{
    $accountValidate = $this->yourValidatorName($request->all(), $id);
    if (!$accountValidate->fails())
    {
        // success
    }
    else
    {
        // failed
    }
}

答案 2 :(得分:0)

您能告诉我您去postEdit的路线吗?

例如,这是您的路线:

Route::put('users/{user_id_sample}', 'UserController@postEdit');

您可以执行以下操作:

public function rules()
{
    return [
        'username' => 'required|max:200',
        'email' =>  [
                        'required',
                        Rule::unique('users')->ignore($this->route('user_id_sample')),
                    ],
        'pass1' => 'required|min:6',
        'pass2' => 'same:pass1',
    ];
}

答案 3 :(得分:0)

我不确定您的路由参数名称,因为您的路由未包含在帖子中,因此我假设控制器方法上的$id意味着有一个名为id的路由参数。 / p>

'email' =>  [
    'required',
    Rule::unique('users')->ignore($this->route('id')),
],

这将使用route参数中的id,假设它被命名为id。这将告诉规则忽略此电子邮件字段上对此特定用户ID的唯一检查。