如何编写规则来验证多个列的组合在Laravel6,PHP中必须是唯一的?

如何编写规则来验证多个列的组合在Laravel6,PHP中必须是唯一的?,laravel,validation,unique,multiple-columns,rules,Laravel,Validation,Unique,Multiple Columns,Rules,假设您有一个users表,其中包含email列,并且每个用户的电子邮件必须是唯一的,您可以在Laravel中使用以下验证规则 [ 'email' => 'unique:users,email,' . $user->id, ] 在我的例子中,我的users表如下所示 id email type id email type 1 A@mail.com 1 // OK! unique 2

假设您有一个
users
表,其中包含
email
列,并且每个用户的电子邮件必须是唯一的,您可以在Laravel中使用以下验证规则

[
    'email' => 'unique:users,email,' . $user->id,
]
在我的例子中,我的
users
表如下所示

id
email
type
id       email                type
 1       A@mail.com           1    // OK! unique
 2       A@mail.com           2    // OK! unique
 3       B@mail.com           1    // OK! unique
 4       B@mail.com           2    // OK! unique
 5       A@mail.com           1    // NOT OK! already exists with id = 1.
 6       B@mail.com           2    // NOT OK! already exists with id = 4.
对于我的用例,
电子邮件
类型
的组合必须是唯一的,这意味着
电子邮件
可以存在多个时间,
类型
。但是
电子邮件
类型
的组合必须是唯一的。期望的结果如下所示

id
email
type
id       email                type
 1       A@mail.com           1    // OK! unique
 2       A@mail.com           2    // OK! unique
 3       B@mail.com           1    // OK! unique
 4       B@mail.com           2    // OK! unique
 5       A@mail.com           1    // NOT OK! already exists with id = 1.
 6       B@mail.com           2    // NOT OK! already exists with id = 4.

如何编写规则来验证
电子邮件
类型
的组合在PHP的Laravel中必须是唯一的,以防止id为
5
6
的记录被插入数据库?

Laravel的唯一验证规则不能很好地将字段组合处理为唯一。因此,您最好的选择是使用自定义查询实现。可能闭包选项是最容易实现的(但您需要修改的用户实例):


如果您收到请求中的两个字段(类型和电子邮件),您可以在注释中查看由Caddy DZ链接的解决方案,但我认为这不是您的情况。

找到了一些紧凑的解决方案。这对我来说既适用于创建,也适用于更新

[
    'column_1' => 'required|unique:TableName,column_1,' . $this->id . ',id,colum_2,' . $this->column_2
]
注:在Laravel 6中测试


我确实在其他人的另一个问题(多列上的Laravel unique validation)中给出了这个答案。

我会亲自在数据库级别处理这个问题,并捕获唯一的键错误。