Laravel 4 - 如何使用具有软删除功能的唯一验证规则/唯一列?

Rem*_*ben 11 laravel laravel-4

假设您正在尝试创建一个新用户,其用户模型(使用软删除)具有针对其电子邮件地址的唯一规则,但数据库中存在已删除的用户.

尝试验证新用户的数据时,由于现有的电子邮件,您将收到验证错误.

我在我的控制器中做了一些额外的验证,但是在模型中拥有它并不是很好吗?

您会建议创建自定义验证规则吗?

由于我现在还没有找到一个干净的解决方案,我对其他人如何解决这个问题感兴趣.

小智 17

您可以验证传递的额外条件:

'unique:users,deleted_at,NULL'
Run Code Online (Sandbox Code Playgroud)


pet*_*les 15

这听起来像是您的业务逻辑问题,而不是技术问题.

软删除的目的是允许将来可以恢复软删除记录的可能性.但是,如果您的应用程序需要电子邮件的唯一性(这是完全正常的),您不希望同时使用该电子邮件地址创建新用户并能够恢复旧用户,因为这会违反唯一性要求.

因此,如果有一个软删除记录,其中包含您要添加为新记录的电子邮件地址,则应考虑恢复原始记录并将新信息作为更新应用于其中,而不是试图绕过唯一性检查创建一个新记录.

  • 如果您有这样的业务逻辑怎么样:您只是保留已删除的记录以用于跟踪目的而非历史目的.这样的示例是一组配置,其中一些可能会升级.你只想保留旧的.软删除适用于此还是有其他方式? (4认同)

小智 13

这是最好的方法

        'email' => 'required|email|unique:users,email,NULL,id,deleted_at,NULL',
Run Code Online (Sandbox Code Playgroud)

它给你这个查询

select count(*) as aggregate from `users` where `email` = ? and `deleted_at` is null
Run Code Online (Sandbox Code Playgroud)


adr*_*dev 6

Laravel提供" 附加条款 ".

我的URL验证规则(来自更新模型方法)如下所示:

$rules['url'] = 'required|unique:pages,url,'.$page->id.',id,deleted_at,NULL';
Run Code Online (Sandbox Code Playgroud)

这意味着url必须是唯一的,必须忽略当前页面并忽略deleted_atid不是的页面NULL.

希望这可以帮助.