Laravel验证规则:具有附加条件的唯一性



在我的Laravel应用程序中,在users表中,我有一个名为platform的附加列。

当新用户注册时,他们会从三个平台中选择一个:站点1、站点2和站点3。现在,我想验证输入的电子邮件是否唯一,但仅适用于所选平台

例如,假设一个用户存在email = john@doe.complatform = site1

然后,如果你去注册表并输入。。。

email = john@doe.com
platform = site2

你应该可以注册。

但如果你进入。。。

email = john@doe.com
platform = site1

您应该看到一条错误消息,因为用户john@doe.com已经存在于平台site1中。

在我的验证器中,我无法设置此项。如果我这样做,即使平台不同(如预期(,它也会返回错误:

Validator::make($request->all(), [
'email' => ['required', 'unique:users'],
]);

但如果我这样做,试图按平台对唯一条件进行分组,那么即使平台相同,也允许所有注册:

Validator::make($request->all(), [
'email' => ['required', 'unique:users,platform,site1'],
]);

有办法设置这个吗?

您可以在唯一规则中指定where条件。

'email' => [
"required",
Rule::unique('users')->where(fn ($query) => $query->where('platform', request()->platform)), //assuming the request has platform information
];

而且,为了确保数据库级别的唯一性,您可能需要将电子邮件和平台定义为复合唯一密钥

在迁移中:

$table->unique(['email','platform']);

参考:https://laravel.com/docs/9.x/validation#rule-标题下唯一:添加附加Where子句:

https://laravel.com/docs/9.x/migrations#creating-索引,以获取有关在Laravel中创建复合索引的更多信息。

建议:RTF

最新更新