使用软删除的模型和唯一数据库字段进行Laravel验证

时间:2018-09-11 17:44:02

标签: database laravel validation

我正在努力处理该用例。

我有一个具有唯一db字段(电子邮件)的用户模型。我也在使用软删除。

我需要处理三种情况:

1)用户模型已更新。目前,我的验证阻止用户更新,因为该电子邮件已经存在。我认为,如果电子邮件没有更改,则可以通过忽略电子邮件验证来轻松解决。

2)更新了不同的用户模型,并将电子邮件更改为数据库中已经存在的另一封电子邮件。

3)创建了一个新模型,并且数据库中已经存在该电子邮件。

以上所有情况还必须考虑软删除的模型。

有人对如何组织它有一些建议吗?

3 个答案:

答案 0 :(得分:2)

对于更新,您可以调整验证规则以在更新时忽略当前用户记录。规则签名是这样的:

'email' => 'unique:user,email,{$userId},id,deleted_at,NULL'

对于插入new,规则如下:

'email' => 'unique:user,email,NULL,NULL,deleted_at,NULL'

应该工作,并忽略softDeleted记录。如果您在数据库上拥有唯一密钥,If仍然会失败。

当然,如果您还删除记录,那么您将拥有重复项,这是Laravel不能避免的。

答案 1 :(得分:1)

您可以使用Rule::unique()验证。如果您使用模型绑定,则从路由中删除用户模型,或者执行传统的数据库查询以通过ID将用户删除(如果您传入了ID)。然后,您可以在验证中执行此操作。

这也应该包含软删除的模型。

return [
    'email' => Rule::unique('users', 'email')->ignore($user->email)->whereNull('deleted_at)->orWhereNotNull('deleted_at')
]

或者也许是这样

return [
        'email' => Rule::unique('users', 'email')->ignore($user->email)->withTrashed()
    ]

答案 2 :(得分:0)

对于 Laravel 8,上述解决方案不再适用,可能是唯一的规则在未来发生了变化。

但是,您可以使用以下验证规则。

use Illuminate\Validation\Rule;

'email' => [
    'required',
    'email',
    Rule::unique('users', 'email')->where(function($query){
       return $query->whereNull('deleted_at')
         ->orWhereNotNull('deleted_at');
    })
]