Laravel仅在更改时请求更新唯一字段

S_R*_*S_R 2 php validation request laravel laravel-5

我将无法根据某些情况验证用户的电子邮件地址。

例如

如果正在创建用户,则电子邮件地址必须唯一

如果用户正在更新,但电子邮件地址未更改,请忽略唯一的电子邮件规则

如果要更新用户且其电子邮件地址已更改,则该地址必须唯一

我环顾四周,我知道我可以根据像这样的方法指定不同的规则

public function rules()
{
    $user = User::find($this->users);

    switch($this->method())
    {
        case 'POST':
        {
            return [
                'user.email'      => 'required|email|unique:users,email',
            ];
        }
        case 'PUT':
        case 'PATCH':
        {
            return [
                'user.email'      => 'required|email,
            ];
        }
        default:break;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有任何方法可以使该规则在放置/修补情况下检查电子邮件地址是否已更改,如果必须更改,则该电子邮件地址必须是唯一的?

如果不是,有没有更干净的方法可以实现这一目标?也许没有开关盒?也许我还没有偶然发现更多的深度验证规则?

rkj*_*rkj 6

如果我对您的理解正确,那么您想unique在电子邮件更改的情况下添加验证,如果是这样,那么您只需要在验证中添加一个条件即可。如果检查独特验证它的结构是这样的unique:table,column,except,idColumn,检查文件

因此,验证将如下所示:当您创建新记录时,该记录$userId将为null,但在打补丁时它将具有价值。因此,此验证将同时适用于create和patch。

$userId = isset($user) ? $user->id : null;

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

 $this->validate($request, $rules);
Run Code Online (Sandbox Code Playgroud)


Dja*_*ave 5

我遇到了类似的问题,并在文档中找到了解决该问题的简洁方法。

我的问题是,如果已经创建了用户,则电子邮件地址声称它不是唯一的,即使它已经注册给该用户。

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

下面的几个标题是这样的:

use Illuminate\Validation\Rule;

$request->validate([
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);
Run Code Online (Sandbox Code Playgroud)

这会执行以下操作:

验证电子邮件地址,使其成为必需且唯一,除非该行的用户 ID 与该用户匹配。