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

Pio*_*trG 5 database validation laravel

我正在尝试思考如何处理这个用例。

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

我需要处理三种情况:

1)更新用户模型。目前,我的验证阻止用户更新,因为这封电子邮件当然已经存在。我认为如果电子邮件未更改,通过忽略电子邮件验证可以轻松解决此问题。

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

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

所有上述场景还必须考虑软删除模型。

有人对如何构建这个有一些建议吗?

Dar*_*rke 8

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

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

为了插入新的,像这样的规则:

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

应该工作并忽略softDeleted记录。如果数据库上有唯一键,仍然会失败。

当然,如果您还取消删除一条记录,则会出现重复项,这是 Laravel 无法阻止的。


Joh*_*sey 6

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

这也应该适应软删除模型。

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