更新期间验证用户电子邮件字段

时间:2017-07-24 10:52:48

标签: php laravel

我是laravel的新手。

目前,我正在处理用户表CRUD操作。创建,删除和阅读时我没有任何问题。我想通过验证更新用户电子邮件列。

当我将电子邮件字段设为unique时,创建时没问题,因为它可以完美地处理没有重复的电子邮件字段。

验证:

$this->validate($request,[
    'email' => 'required|unique:users'
],
$messages = [
        'required' => 'The :attribute field is required.',
        'unique' => 'The :attribute must be unique',
    ]
);

但是,在更新记录时,如果电子邮件字段未更改且其他更改,则验证因唯一违规而失败,因为电子邮件已通过自​​检记录进行检查。

即使用户电子邮件发生了变化,我也希望在电子邮件领域具有唯一性。

任何人都可以给我一些建议来摆脱这个问题吗?

3 个答案:

答案 0 :(得分:2)

您要做的是在验证过程中忽略特定的用户ID。通过将ID忽略到您的唯一规则,Laravel将在检查电子邮件地址的唯一性时排除该用户。

https://laravel.com/docs/5.4/validation#rule-unique

规则的格式为:

unique:table,column,except,idColumn

在您的方案中,您可以像这样使用它:

[
    'email' => 'required|unique:users,email,' . $userId
]

此方案中的$userId是您要更新的用户的ID。通常,这将出现在您的请求中,因此您应该可以从那里访问它。如果您要忽略的列与id不同,则可以将其添加为规则的下一部分:

'email' => 'required|unique:users,email,' . $userId . ',other_column'

5.3版及更高版本中唯一规则的另一种可读语法是:

Rule::unique('users')->ignore($userId),

答案 1 :(得分:1)

有时,您可能希望在唯一检查期间忽略给定的ID。例如,考虑一个“更新配置文件”屏幕,其中包括用户的名称,电子邮件地址和位置。当然,您需要验证电子邮件地址是否唯一。但是,如果用户仅更改名称字段而不更改电子邮件字段,则不希望抛出验证错误,因为用户已经是电子邮件地址的所有者。如果用户提供已由其他用户使用的电子邮件地址,您只想抛出验证错误。要告诉唯一规则忽略用户的ID,您可以将ID作为第三个参数传递:

   'email' => 'unique:users,email_address,'.$user->id

答案 2 :(得分:0)

我想你可以试试这个:

'email'     => Auth::check()
                ? 'required|email|unique:users,email,'.Auth::id()
                : 'required|email|unique:users,email',

希望对你有所帮助!!

相关问题