【问题标题】:How to forcing a unique rule to ignore a given id?如何强制一个独特的规则忽略给定的 id?
【发布时间】:2019-01-09 20:13:06
【问题描述】:

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

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

代码用户控制器:

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。但我不明白如何解决这个问题

【问题讨论】:

标签: laravel laravel-5.6


【解决方案1】:

我不确定你的路由参数名称,因为你的路由没有包含在帖子中,所以我假设控制器方法上的$id 意味着有一个名为id 的路由参数。

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

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

【讨论】:

    【解决方案2】:

    您可以使用 Rule 外观来做到这一点..

    '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
        }
    }
    

    【讨论】:

    • 我已经修改了上面的代码。但它仍然失败。您查看您的帮助与
    • 表单请求在从容器中解析时得到验证。验证器在您到达该方法的第一行 postEdit 之前就已创建和验证。
    • 请求到达postEdit,如果成功则在保存之前得到验证..
    【解决方案3】:

    你能告诉我你去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',
        ];
    }
    

    【讨论】:

      【解决方案4】:
      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 传递给忽略。

      希望这会有所帮助。

      【讨论】:

      • 我已经修改了上面的代码。但它仍然失败。您查看您的帮助与
      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2015-08-10
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 2020-06-19
      相关资源
      最近更新 更多