我是laravel的新手。
目前,我正在处理用户表CRUD
操作。创建,删除和阅读时我没有任何问题。我想通过验证更新用户电子邮件列。
当我将电子邮件字段设为unique
时,创建时没问题,因为它可以完美地处理没有重复的电子邮件字段。
验证:
$this->validate($request,[
'email' => 'required|unique:users'
],
$messages = [
'required' => 'The :attribute field is required.',
'unique' => 'The :attribute must be unique',
]
);
但是,在更新记录时,如果电子邮件字段未更改且其他更改,则验证因唯一违规而失败,因为电子邮件已通过自检记录进行检查。
即使用户电子邮件发生了变化,我也希望在电子邮件领域具有唯一性。
任何人都可以给我一些建议来摆脱这个问题吗?
答案 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',
希望对你有所帮助!!