2013-07-03 129 views
10

假设您正试图创建一个新用户,并使用用户模型(使用软删除)为其电子邮件地址设置了唯一的规则,但数据库中存在已删除的用户。Laravel 4 - 如何使用软删除的唯一验证规则/唯一列?

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

我在我的控制器中做了一些额外的验证,但是将它全部放在模型中不是很好吗?

你会建议创建一个自定义验证规则吗?

因为我现在还没有找到一个干净的解决方案,所以我对其他人如何解决这个问题深表兴趣。

回答

14

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

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

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

+0

您是否只是在此处发布此信息:http:// forums .laravel.io/viewtopic.php?pid = 45610#p45610鬼鬼祟祟。 –

+1

不打算偷偷摸摸。但作为提问者在这两个地方问,有点需要在两个回答;) – petercoles

+0

哦,不,不。完全所有这一切:] –

0

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

+0

的问题是,我现在用的是“独一无二”的验证规则和验证类不使用进行检查时的模型类,因此不会自动添加删除。你会建议不使用验证器,但将验证添加到单独的模型方法? – Remluben

+0

查看API,似乎'DatabasePresenceVerifier'类使用查询生成器来查询表的存在。这就是说,它没有考虑软删除。正如我在@kuroi之前提到的那样,我想说为什么不先检查帐户有效性,然后在注册之前还原该帐户... –

16

您可以验证通过额外的条件:

'unique:users,deleted_at,NULL' 
5

Laravel提供了 “Additional Where Clauses”。

我的网址验证规则(从更新模型法)看起来是这样的:

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

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

希望这会有所帮助。

+0

感谢您的回复。不知何故,我设法忽略了长时间添加多个独特规则依赖的可能性。尽管如此,我不确定是否应该像@petercoles 的回答中所描述的那样改变我的业务逻辑(就像我那样),还有Gabriel Koerich写了一个类似于您的答案 – Remluben

+0

是的!我自己同意@petercoles。拥有良好的商业逻辑会更好。 但有时你只需要有一个解决方法... 我很高兴它帮助你! – adrianthedev

11

这是最好的办法

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

它给你这个查询

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

谢谢。它有助于显示实际查询对于独特规则的用途,否则可能难以理解。 –

+0

当我试图更新模型时,它给了我一个错误,因为这个电子邮件已经存在,是的,它确实存在,但它属于我试图更新的同一个实例! – ademin