请问在 userrequest 里面的 rules 里面设置了用户名为唯一,怎么没有设 email 为唯一验证?

类似于这种unique:users,在注册的时候验证了唯一性,但是修改资料怎么就不验证唯一性?谢谢。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

@sachu 確實在生產環境中也會需要檢查,但教學可能因較著重在大方向而沒有著墨這種細節
不過既然樓主提到了,文件的表單驗證中有提到解決方式:

强迫 Unique 规则忽略指定 ID :

有时,你可能希望在进行字段唯一性验证时忽略指定 ID 。例如, 在「更新个人资料」页面会包含用户名、邮箱和地点。这时你会想要验证更新的 E-mail 值是否唯一。如果用户仅更改了用户名字段而没有改 E-mail 字段,就不需要抛出验证错误,因为此用户已经是这个 E-mail 的拥有者了。

使用 Rule 类定义规则来指示验证器忽略用户的 ID。这个例子中通过数组来指定验证规则,而不是使用 | 字符来分隔:

use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);

如果你的数据表使用的主键名称不是 id ,那就在调用 ignore 方法时指定字段的名称:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')
6年前 评论
讨论数量: 8

@sachu 確實在生產環境中也會需要檢查,但教學可能因較著重在大方向而沒有著墨這種細節
不過既然樓主提到了,文件的表單驗證中有提到解決方式:

强迫 Unique 规则忽略指定 ID :

有时,你可能希望在进行字段唯一性验证时忽略指定 ID 。例如, 在「更新个人资料」页面会包含用户名、邮箱和地点。这时你会想要验证更新的 E-mail 值是否唯一。如果用户仅更改了用户名字段而没有改 E-mail 字段,就不需要抛出验证错误,因为此用户已经是这个 E-mail 的拥有者了。

使用 Rule 类定义规则来指示验证器忽略用户的 ID。这个例子中通过数组来指定验证规则,而不是使用 | 字符来分隔:

use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);

如果你的数据表使用的主键名称不是 id ,那就在调用 ignore 方法时指定字段的名称:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')
6年前 评论
Jourdon

注册的时候 email 或者用户名不可以相同,所以在数据库是唯一的,编辑的时假数据库中其它已经有这条记录了,还检查唯一,那你是必须要修改这一项吗?

6年前 评论

@sachu 確實在生產環境中也會需要檢查,但教學可能因較著重在大方向而沒有著墨這種細節
不過既然樓主提到了,文件的表單驗證中有提到解決方式:

强迫 Unique 规则忽略指定 ID :

有时,你可能希望在进行字段唯一性验证时忽略指定 ID 。例如, 在「更新个人资料」页面会包含用户名、邮箱和地点。这时你会想要验证更新的 E-mail 值是否唯一。如果用户仅更改了用户名字段而没有改 E-mail 字段,就不需要抛出验证错误,因为此用户已经是这个 E-mail 的拥有者了。

使用 Rule 类定义规则来指示验证器忽略用户的 ID。这个例子中通过数组来指定验证规则,而不是使用 | 字符来分隔:

use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);

如果你的数据表使用的主键名称不是 id ,那就在调用 ignore 方法时指定字段的名称:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')
6年前 评论
ruodee

email在创建表的时候设置了 unique,所以没有必要设置两个同样的校验。数据库校验不通过同样会将错误信息返回到$error中

5年前 评论

@老好人 不会返回到$error中,而是会直接抛出异常:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry

5年前 评论
public function messages()
    {
        return [
            'name.required' => '用户名不能为空。',
            'name.between' => '用户名必须介于 3 - 25 个字符之间。',
            'name.regex' => '用户名只支持中文、数字、字母、下划线。',
            'name.unique' => '用户名已存在。',

            'email.required' => '邮箱不能为空。',
            'email.email' => '请填写正确的邮箱地址。',

            'introduction.max' => '个人简介最多80个字符。',
        ];
    }
5年前 评论

@ruodee
那比如,2个用户A和B,注册时邮箱不一样,然后B在修改资料时把自己的邮箱改成和A一样的了,这样不对吧?
因为修改资料时email并没有unique,所以无法避免这种情况。
所以是不是这里也必须要把email的验证加上unique?

4年前 评论
ruodee

@holyLight 修改邮箱一般使用发送验证码验证,以防止恶意测试邮箱是否被注册。还比如用户登录验证的时候,不具体返回用户名不存在、密码错误,而是一般返回“用户名或密码错误”,也是防止专门性的探测、针对。邮箱唯一性的验证不妨放在邮箱验证码验证之后。
如果在此加入邮箱唯一性验证,每次修改用户其他资料而不改变邮箱的时候,都会返回邮箱已存在的错误,所以同用户名唯一性验证一样,要加入忽略自身的条件。

4年前 评论

这都是什么回答啊。。。晕死。。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!