在我的Laravel应用程序中,在users
表中,我有一个名为platform
的附加列。
当新用户注册时,他们会从三个平台中选择一个:站点1、站点2和站点3。现在,我想验证输入的电子邮件是否唯一,但仅适用于所选平台。
例如,假设一个用户存在email = john@doe.com
和platform = 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