在开发Laravel应用时,表单验证是确保数据完整性和安全性的关键步骤之一。Laravel提供了强大灵活的验证规则,其中 exists
和 unique
是用于检查数据库中数据存在性和唯一性的常用验证规则。不过,当我们的数据模型使用了软删除功能(即使用 SoftDeletes
)时,使用这些验证规则默认会包含软删除的记录,这在某些场景下并不是我们所期望的。因此,我们需要对这些规则进行自定义扩展,以排除软删除的记录。
软删除概览
在Laravel中,使用 SoftDeletes
能使得模型在被删除时,并不真正从数据库中移除,而是设置了一个 deleted_at
字段来标记该记录已被软删除。查询软删除模型时,默认不会包含这些已标记为软删除的记录。
exists
验证去除软删除字段的校验
当你使用 exists
规则进行数据验证时,如果想要排除软删除的数据,可以通过自定义查询条件来实现。
// 假设我们验证 users 表中的 email 字段,但要排除软删除的记录
'required|email|exists:users,email,NULL,id,deleted_at,NULL'
在这个规则中,exists
的基本语法是 exists:table,column,except,column,value,...
,我们在最后添加了 deleted_at,NULL
这个条件,这样就能排除那些 deleted_at
列不为 NULL
(即已软删除)的记录。
unique
验证去除软删除字段的校验
相对于 exists
规则,unique
规则的调整稍微有一点不同,因为 unique
规则主要用于确保数据库表中指定字段值的唯一性,如果需要排除软删除记录,我们同样需要自定义查询条件。
// 假设我们在 users 表中验证 email 字段的唯一性,同时要排除软删除的记录
'email|unique:users,email,NULL,id,deleted_at,NULL'
在这个 unique
规则中,我们通过在条件中指定 deleted_at,NULL
来忽略软删除的数据。
自定义验证规则
如果你发现你需要频繁在验证规则中排除软删除的记录,可以考虑定义自定义验证规则,这能使代码更加整洁、复用性更高。
在 AppServiceProvider
或者专门的 ValidationServiceProvider
中,你可以使用 Validator::extend
方法来扩展自定义验证规则。例如,你可以定义一个名为 unique_without_trashed
的规则。
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
class ValidationServiceProvider extends ServiceProvider
{
public function boot()
{
Validator::extend('unique_without_trashed', function ($attribute, $value, $parameters, $validator) {
// 自定义验证逻辑
});
}
}
在这个自定义验证中,你可以通过Laravel的查询构造器或Eloquent来实现排除软删除记录的唯一性检查逻辑。
总结
虽然Laravel的验证系统非常强大和灵活,但在处理软删除数据时仍需要特别注意。通过正确使用验证规则,并在需要时创建自定义验证规则,你可以确保应用的数据验证既准确又高效。记得在对 unique
和 exists
规则进程自定义时,清晰地注明你排除软删除记录的意图,这将使得代码更容易理解和维护。