在开发Laravel应用时,表单验证是确保数据完整性和安全性的关键步骤之一。Laravel提供了强大灵活的验证规则,其中 existsunique是用于检查数据库中数据存在性和唯一性的常用验证规则。不过,当我们的数据模型使用了软删除功能(即使用 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的验证系统非常强大和灵活,但在处理软删除数据时仍需要特别注意。通过正确使用验证规则,并在需要时创建自定义验证规则,你可以确保应用的数据验证既准确又高效。记得在对 uniqueexists规则进程自定义时,清晰地注明你排除软删除记录的意图,这将使得代码更容易理解和维护。

云服务器/高防CDN推荐

蓝易云国内/海外高防云服务器推荐


海外免备案云服务器链接:www.tsyvps.com

蓝易云安全企业级高防CDN:www.tsycdn.com

持有增值电信营业许可证:B1-20222080【资质齐全】

蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。

蓝易云是一家专注于香港及国内数据中心服务的提供商,提供高质量的服务器租用和云计算服务、包括免备案香港服务器、香港CN2、美国服务器、海外高防服务器、国内高防服务器、香港VPS等。致力于为用户提供稳定,快速的网络连接和优质的客户体验。
最后修改:2024 年 03 月 18 日
如果觉得我的文章对你有用,请随意赞赏