如何编写规则以验证多列的组合在PHP Laravel 6中必须是唯一的?

问题描述 投票:0回答:2

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

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

就我而言,我的users表如下所示

id
email
type

对于我的用例,emailtype的组合必须唯一,这意味着email可以存在多次,type也是如此。但是emailtype的组合必须唯一。所需的结果如下所示

id       email                type
 1       [email protected]           1    // OK! unique
 2       [email protected]           2    // OK! unique
 3       [email protected]           1    // OK! unique
 4       [email protected]           2    // OK! unique
 5       [email protected]           1    // NOT OK! already exists with id = 1.
 6       [email protected]           2    // NOT OK! already exists with id = 4.

[如何编写规则以验证emailtype的组合在Laravel,PHP中必须唯一,以防止将ID为56的记录插入数据库?

laravel validation unique multiple-columns rules
2个回答
0
投票

Laravel的唯一验证规则不能将井场组合视为唯一字段。因此,最好的选择是使用自定义查询来实现custom validation method or class。可能闭包选项是最简单的实现(但是您需要修改后的用户实例):

function ($attribute, $value, $fail) use ($user) {
  $exists = User::where('users.email', $value)
    ->where('users.type', $user->type)
    ->where('users.id', '!=', $user->id)
    ->count();

  if ($exists) {
    $fail($attribute . ' is invalid.');
  }
}

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


0
投票

已找到一些紧凑的解决方案。这对我来说都适用于创建和更新。

[
    'column_1' => 'required|unique:TableName,column_1,' . $this->id . ',id,colum_2,' . $this->column_2
]

注意:在Laravel 6中测试。

我确实将此答案放在另一个人的另一个问题(多列中的Laravel唯一验证)上。

© www.soinside.com 2019 - 2024. All rights reserved.