13

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

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

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

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

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

4

5 回答 5

18

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

'unique:users,deleted_at,NULL'
于 2013-07-17T21:47:19.520 回答
15

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

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

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

于 2013-07-04T04:52:25.967 回答
14

这是最好的方法

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

它给你这个查询

select count(*) as aggregate from `users` where `email` = ? and `deleted_at` is null
于 2014-09-02T14:54:33.677 回答
6

Laravel 提供“附加 Where 子句”。

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

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

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

希望这可以帮助。

于 2014-04-17T10:04:04.923 回答
0

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

于 2013-07-03T23:44:56.110 回答