【问题标题】:Validation of user email field during update在更新期间验证用户电子邮件字段
【发布时间】:2017-12-29 22:17:14
【问题描述】:

我是 laravel 的新手。

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

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

验证:

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

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

即使用户电子邮件被更改,我也希望电子邮件字段具有唯一性。

谁能给我一些建议来解决这个问题?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您想要做的是在验证过程中忽略特定的用户 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),
    

    【讨论】:

    • 我将user_id 设置为$request->id,所以我可以将它放在$userId 中?
    • 没错,你只需要粘贴用户 ID 代替 $userId
    • 好的,我试试
    • 不用担心,很高兴它有帮助!
    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    我想你可以试试这个:

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

    希望对您有所帮助!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多