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

时间:2013-07-03 21:48:44

标签: laravel laravel-4

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

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

我在我的控制器中进行了一些额外的验证,但是在模型中将它全部包含在内是不是很好?

您是否建议创建自定义验证规则?

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

5 个答案:

答案 0 :(得分:16)

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

'unique:users,deleted_at,NULL'

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:12)

这是最好的方法

        'email' => 'required|email|unique:users,email,NULL,id,deleted_at,NULL',

它为您提供此查询

select count(*) as aggregate from `users` where `email` = ? and `deleted_at` is null

答案 3 :(得分:6)

Laravel提供" Additional Where Clauses "。

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

$rules['url'] = 'required|unique:pages,url,'.$page->id.',id,deleted_at,NULL';

这意味着该网址必须是唯一的,必须忽略当前网页并忽略deleted_at ID不是NULL的网页。

希望这有帮助。

答案 4 :(得分:0)

您的Eloquent模型应该设置$softDeletes属性。如果是这样,那么当您执行WHERE检查时,如User::where('username', 'jimbob'),Eloquent将自动添加查询WHERE deleted_at IS NULL ...这将排除软删除的项目。